TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 * T4 T2 m2 S2 p( E
+ ]0 X: @3 f& G理了理思路,重新做了一个测试。# A0 Z" ?2 g' T9 |1 c$ g: K5 a
做了两个 vector 和 两个 float *, 都长 100000
3 i* h' H; t* Q5 n* m外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.( O2 m Z8 A& r% }
7 A- N, u: L& x+ R7 Y
内循环试了4种方法,
) N" V* g' t# A$ b! }4 }" S1. 直接调用 vector inner_product 247s 5 ~! Z3 a; G% A& k5 ~: d6 x) G
2. vector 循环点乘累加 237s c" D7 q: E# F% \
3. float * 循环点乘累加 204s
7 S/ {: P9 O7 I1 t4. 空循环 100000 次 202s
, g6 U" C) ^) d' {0 s6 E: ?
@+ p1 N7 X" X" q5 H不做内循环 200s% b4 Y% Q' L. C, n: M- l6 n
( o1 y8 j; `( b8 M8 |+ j你昨天说的对,内循环本身占比是很小的,大头在其他处理。
6 `: H6 B. A- Q, D& x! a; U另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。6 j1 R! l& V; p) ]! K2 } J8 O: n" p
0 R! `) R1 Q- N至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
1 c3 c b% ]- l: R$ w& z/ s" u7 {7 h/ a# D) Q, n% Z& u, n
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
/ U2 i# F; `( K/ {# i- f2 f! a5 e/ |( r
std::vector < float > vec1(N);- R; T3 q$ A0 o, E' @. |- }
std::vector < float > vec2(N);( S3 o$ L! M9 f) N
float* b1 = new float[N];6 `+ r2 J9 I/ t3 F( d2 E
float* b2 = new float[N];2 S0 e) e' n ], l1 @9 g! s" O! y' o
+ B+ E/ s3 G1 {( t9 m for (int j = 0; j < 6000; j++)+ ^+ i, Z9 E/ }# l. h2 h: N" t
{4 G% s) X! |) u
std::generate(vec1.begin(), vec1.end(), []() {
7 d0 ^$ v8 C; X' O, u8 u return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
" P7 N3 Y" C2 C' U' L' J( j });6 t* @+ a, V2 o5 K1 {8 o% u
& G$ h% Y u& ?0 z9 m3 x std::generate(vec2.begin(), vec2.end(), []() {( L( g. i" v! u" D! P2 V. I
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
. g/ G8 b6 w2 \3 P3 y });
, U1 D( ^- \+ P* Y, u" ` b' h
8 R+ I# g( C8 u' T7 V7 } for (size_t jj = 0; jj < vec1.size(); jj++)
( c; `) D& t6 u/ w {
. k* C/ V }1 U- I b1[jj] = vec1[jj];! U F) H' L3 ?
}
4 S- M6 r# W+ m p) E: V! e) B, {" V: c4 q+ @6 @7 z. N8 L8 w
for (size_t jj = 0; jj < vec2.size(); jj++)
6 @! B; s6 K1 T4 N3 E {" A* n- V% O& A6 N. a6 |( l, K$ S
b2[jj] = vec2[jj];
* }& A; a8 X, X. ? }
" W% F! _7 E: Z2 V7 ~ l/ c# p a' F$ j* i
//Method - 1 N=100000 247s
& O; n/ c+ ~- c5 t& z //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
1 c: `8 O$ v3 A& [1 z: W" L
2 G8 N; h9 F/ a% h! r //Method - 2 N=100000 237s
5 l9 e& Z z3 l# F0 N6 X /*" O5 ~9 ]. T9 j- m( O/ ]
for (int jj = 0; jj < N ; jj++)2 C/ M c: k% B$ e
{7 g' u- d$ r( \5 A
fresult += vec1[jj] * vec2[jj];8 o8 m5 Y9 q/ w
}( D) ~! V1 y# H ^
*// a4 ^, q! f8 s {- ~
' O1 ]. {5 E# v1 ?6 G+ N //Method - 3 N=100000 204s. Y9 l* I6 M/ h
/*
2 I5 y; o: _1 {% X0 ?! @; B4 w3 ] for (int jj = 0; jj < N; jj++). q2 e, h. Y9 j
{: e; e6 q2 h% V* I t0 T
fresult += b1[jj] * b2[jj];
# d H8 e; i ]2 s+ c. x$ Y }
0 `" J/ d) I' V8 d# @, y */
- N9 M8 z; R+ x# b1 X! z2 b8 e$ G% a, s9 s3 {5 y( \& M5 [9 f
//Method - 4 202s( g: V4 ^0 ^, F/ z% o- p D" H
/*5 m' _! g) b4 @
for (int jj = 0; jj < N; jj++)
! c' P6 l' n+ v& j* }9 Q" b3 A& H {6 k& o5 I ]4 k, r) a( v
: \" _- U* h' d1 Q" H' @ }9 O; ]7 N ^7 w2 D
*/& @1 Y) b! i' |4 v& k- j
//comment out all methods, N=100000 202s 3 q5 X4 |! k, r
}+ w/ `0 |; v4 b' j3 C. ]
1 N0 ^' ~6 e6 [* a, C- o ]# \
delete []b1;
$ D3 c# C7 \% `, U$ s* `0 l# G delete []b2;
4 d0 L7 i$ f5 m |
|