TA的每日心情 | 奋斗 4 天前 |
|---|
签到天数: 1184 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
7 n$ o5 k# f0 r$ q- p+ X' ?( b8 B$ A9 G* x. n
理了理思路,重新做了一个测试。- ` Y7 g- \. Y0 {. V0 y7 j) A7 K
做了两个 vector 和 两个 float *, 都长 100000/ o0 e/ f# w5 |" W# w9 ?. b$ z' n
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
: Q' J# S5 ^9 O2 }
8 P8 v+ q, s1 G+ `/ n内循环试了4种方法,, s2 q' a+ v- e9 c0 ^% W# G
1. 直接调用 vector inner_product 247s
7 G' B% M3 ?# F# T2. vector 循环点乘累加 237s5 V5 w/ ]0 b4 D, @
3. float * 循环点乘累加 204s
6 i( B3 i( b6 n* l4. 空循环 100000 次 202s4 L; A2 P/ f3 p+ V+ p+ p7 h
7 g; q# ?% m" a. a5 x, v& a! g) }
不做内循环 200s
' m/ M/ o/ `' m* [6 V; Z
( n0 b. a( S3 J" t2 e- k: t# A8 t你昨天说的对,内循环本身占比是很小的,大头在其他处理。' v( C5 n6 T' w! D
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
6 ?9 x4 I' h, `# k; C" ]4 H0 v7 k' e6 T
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)3 {8 m8 v0 j( A1 w! L, w% }2 r& X
( ]# o* }5 J! n(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL); L* N* z7 k/ b X3 k) q
& E! J6 N8 U! |- d9 J: o std::vector < float > vec1(N);6 ?+ S, U$ h! M& {: Z3 [. H
std::vector < float > vec2(N);9 V Z9 K6 X/ n
float* b1 = new float[N];
* | h0 {1 |7 J' R. w; Q2 {8 B float* b2 = new float[N];3 B/ O* G0 [6 U
% o4 J- P+ H" _( K( z# ?) p
for (int j = 0; j < 6000; j++)
" }4 Y6 }" C2 L/ |* n {8 M$ L- ]4 Y/ {9 N
std::generate(vec1.begin(), vec1.end(), []() {, W& n( H2 O3 N' T
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;$ }3 O, I/ [, E# B
});# ~& \+ B' a* v9 C; |
( `* x/ w- c1 b. L- |+ q; E/ F
std::generate(vec2.begin(), vec2.end(), []() {
C: y5 |6 U- `2 N return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
H3 H: [ ]. v* |: ? });( b/ n' _, y0 L- B, W0 W
* ^+ }8 W* G! u
for (size_t jj = 0; jj < vec1.size(); jj++)
- @$ i3 _$ C1 J7 k2 s" T {7 E- G c- y5 `" C8 j$ x$ P8 b
b1[jj] = vec1[jj];
* _/ s! a( D% s* N2 C; ` }
2 k ~- B$ t/ D5 ]4 P
3 V) \5 e, K! n6 i9 L* ? for (size_t jj = 0; jj < vec2.size(); jj++)
) I5 D/ n, [- S: q {7 q: ?' n" q# b5 A3 W Z
b2[jj] = vec2[jj];. F3 Z x' }, p8 h& c
}
& H; B. y# g4 L. s: h3 R/ z) o& F; P/ A+ U
//Method - 1 N=100000 247s
2 i4 Q+ n. S6 ^+ d$ u //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
; I) G' M, |. F C/ S+ A& T8 r ( A: A, Q# d e9 w
//Method - 2 N=100000 237s
2 l+ e( M, U6 }: c; _ /*
7 s. \1 m6 R8 I/ `! U4 ] for (int jj = 0; jj < N ; jj++)
4 Q( V9 X& B n/ [- G3 ^5 d {0 O' C; d, I$ `2 t
fresult += vec1[jj] * vec2[jj];
" D% K9 j. e; k/ u4 X }4 i, n- s" o4 J+ q# f
*/
z( d+ \. W7 X: `$ C+ s. u5 U
+ p* d* W, T6 y, J% k) C //Method - 3 N=100000 204s" B* B; ^; G3 ^; i/ g2 g" G7 b
/*
2 j9 v3 N, U6 v9 Y; S( S' z$ a for (int jj = 0; jj < N; jj++)
: R% X1 L( f6 ^+ A7 b Z( E4 n/ I {
$ a& G- G1 x7 v- f fresult += b1[jj] * b2[jj];
K' b' ^4 E+ V4 \7 H+ u }
7 r% T% e, `' p* d */
7 s2 \0 }4 Q' b" S8 r. G3 h2 ^2 V7 P5 G- W+ n
//Method - 4 202s
1 ~+ }2 o$ ?6 a3 l /*; P9 M& z/ Q. h0 y
for (int jj = 0; jj < N; jj++)
2 q" C8 @ H/ Y% s! u9 h {* W9 f% C4 {% {! ^
7 F3 t1 \* j8 v& T
}
$ l: H, d2 p5 P0 V1 u- w2 G */
% h% v- W0 R0 }( P1 t( S: j //comment out all methods, N=100000 202s 5 Z: o; @8 y$ q: I5 G
}
- G, h% t; r3 c$ z- Y/ r& b8 x) s% d, @: E' |; Q: [
delete []b1;
$ z, A$ O9 |6 N$ w delete []b2;
- f$ g L( s8 R& H7 F. b |
|