TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 Z# { @: F! B
- x$ a% v# F8 }& A- f理了理思路,重新做了一个测试。& ^& p( c5 a: Z$ U3 \& Z
做了两个 vector 和 两个 float *, 都长 1000002 l( x$ o% O& a, ]
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
/ _- l) X6 ?, G# }" C) v F
3 P" a! P& }9 w. r! k' y( S9 e内循环试了4种方法,/ W% G: ~( k# }" x8 J
1. 直接调用 vector inner_product 247s + t6 g- I& s; ^1 g2 K* Z
2. vector 循环点乘累加 237s. Q; {5 H# c" ]' w3 `3 {' ~
3. float * 循环点乘累加 204s
' Z2 J$ j2 B6 z4. 空循环 100000 次 202s
! {1 P2 D2 A% G9 e7 ]% Q; V
- @; k. w, `$ b* N- L7 Z不做内循环 200s+ J- S0 H) J; Q8 v
0 q! M3 Y( t, `3 R' `; y
你昨天说的对,内循环本身占比是很小的,大头在其他处理。& T- T9 P1 U5 u2 f
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。7 _2 I9 d1 Y. u- A- c' I! E- X2 Q
2 k+ ~) J9 b- }: L, C' B7 z至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)) |3 G/ e+ h% @+ @ p9 |
. x+ v# V4 T6 n0 B! s
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
7 j# U8 N) M2 I! E5 D9 [4 O! V1 Z: [
std::vector < float > vec1(N);
4 m6 O, ?* x8 l1 N, U* ?# j% g2 J std::vector < float > vec2(N);
' R! z6 `( X$ z5 x float* b1 = new float[N];
5 g" Q3 V' P( t" N float* b2 = new float[N];* o( \8 ^& G% ~, \" [
8 | q# j+ X. @5 e! H" U for (int j = 0; j < 6000; j++)
8 U Z$ d1 G$ x1 x0 O. U {
4 o. B) s/ A$ Y std::generate(vec1.begin(), vec1.end(), []() {3 z8 b1 b5 V+ L' \ u8 a( d- U8 d
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
' ~! p# r R5 {& L0 e: ]$ Z$ b+ U# { });
W( W0 ]0 h! s0 _6 G7 M8 x" R1 O: x3 d; P" S
std::generate(vec2.begin(), vec2.end(), []() {
8 b# i9 j) D. ?9 q1 v return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;. t/ \+ `1 L+ l3 b
});
~2 d# a+ z1 o* e1 M" i* W6 T, B) v+ L( r; o" }
for (size_t jj = 0; jj < vec1.size(); jj++)/ w" m1 k( C9 R" L. @5 D- i3 @
{8 i+ o2 s* k0 H' Z9 X, g' d
b1[jj] = vec1[jj];
6 G/ Y: n7 D0 J6 W5 Z: V1 D+ O }. q* I0 i8 t, L6 ^$ X( J0 _
# p9 U4 w* l6 r for (size_t jj = 0; jj < vec2.size(); jj++)
' j) y8 O7 F' G H7 ?6 F {
" h; y: G( v' C' l$ T' b b2[jj] = vec2[jj];
! @# E$ X$ t+ ^8 {4 p }; j p6 A; T4 c* n% ?* u
/ h$ D/ ]1 H. ?7 O //Method - 1 N=100000 247s
( K) v+ |! @. ~: g //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);7 e: P8 \" Q" j! p
7 n2 }% v3 w- W7 t( y( W' I
//Method - 2 N=100000 237s
) B2 t O) E2 @3 A5 a /*9 K2 X: ~6 u/ U' V
for (int jj = 0; jj < N ; jj++)
. F w& }& [3 [ ^ {
: Z9 r' v/ h( ]# _, ]5 B" d# \ fresult += vec1[jj] * vec2[jj];
; }2 O2 J# h& x7 A {; b }" u M$ s' _- @
*/
3 k- q1 }* S N8 j ; E" u; E! z# E, o! R% N& w" N
//Method - 3 N=100000 204s
7 U9 m6 a! s8 o- k& o6 Q /*6 z" e) Q/ x) q. \) v
for (int jj = 0; jj < N; jj++)6 ~+ ? H3 J$ o4 A
{
' j: D' L! d- l- F0 C fresult += b1[jj] * b2[jj];7 @5 X7 [4 Q$ F
}
/ @1 R% C, q' W2 s+ R */' ^; {' X9 q7 K- [0 V
9 l `" G7 ?! {0 W9 g
//Method - 4 202s
' a9 s. ?6 P2 s( a; s /*& a2 o& N5 m4 s0 l1 m
for (int jj = 0; jj < N; jj++)7 N; K1 a I5 d t) x. ?4 t
{( l% R6 M. |- k
+ v( m% m, I7 \5 j2 X }
' G0 r5 D; l9 I5 r */9 e" E: m/ B9 f6 o. ]; P# h
//comment out all methods, N=100000 202s : m9 k: A0 P I" J( p$ V
}
2 u1 B, w- R$ H
: {+ D, b1 l; C$ T delete []b1;
. U+ w$ _: P, V% f1 w7 ~ delete []b2; 0 u# U$ A ?1 o0 P" h9 u
|
|