TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 ! ^0 i, s$ ?0 T9 x+ |
! }; M4 a2 T K& F @理了理思路,重新做了一个测试。
% \+ a- x9 t6 p; m+ W做了两个 vector 和 两个 float *, 都长 100000
( s# R+ o+ R. d6 ?+ l) L" V" t# P外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
$ {7 G; K: A' S( ?5 z) B( M
p; r- Y: W+ O1 c2 x0 @内循环试了4种方法,
2 o' n9 R1 r/ y, C1. 直接调用 vector inner_product 247s 0 t1 u4 K9 V' I. ?- Q
2. vector 循环点乘累加 237s6 b+ y' @ v+ e
3. float * 循环点乘累加 204s) [8 q3 q4 N- R: \) X" x
4. 空循环 100000 次 202s5 M9 I7 D2 w, `
, n- Q# s$ e8 s( a8 n不做内循环 200s
. v$ p5 e! o8 C7 u. ?/ t5 ?7 ]. n- j* F- M% w; L
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
0 I% E7 \$ V- N# P7 h另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
5 O" m5 o" B0 m% r* {, R5 k6 [; b6 F9 L$ Z, H7 g" C! ~
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
! U- E; ?- {$ s0 J$ M) R" o
0 H2 N( K( J2 _' L! g: C3 R(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)7 {. C; c, P/ E# Y) K* g
* J0 G* c( W1 M2 D/ G! W/ U std::vector < float > vec1(N);1 z+ N9 K& e2 g
std::vector < float > vec2(N);6 W) D# E! [; O3 r/ o/ ]3 D( _
float* b1 = new float[N];2 o( m# x: R; J3 e1 J' v
float* b2 = new float[N];1 ?& n7 r: x% F( C, ?7 \
9 y* W0 @$ z: D0 Y% a for (int j = 0; j < 6000; j++)
' X" h2 B$ o/ n) t+ J {
6 d! J' f- z5 y! w' x std::generate(vec1.begin(), vec1.end(), []() {1 x0 s) B. |. M7 @
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;. p$ v) P' w( K x% P6 S, e- B
});5 B7 s2 v- Z; h \
; a4 n# R* _8 X' R% q' ^/ p std::generate(vec2.begin(), vec2.end(), []() {" S4 ^7 H2 V- `6 S1 N
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
) f: k' |2 U& X4 E4 o' ~ });
$ C2 c0 \/ X- B ]# |& H/ s1 g! b- k1 b8 ^9 \
for (size_t jj = 0; jj < vec1.size(); jj++)
) s+ G8 H3 Q! E) O' i {4 u3 c1 `, _( Q/ o+ q7 g( D
b1[jj] = vec1[jj];& {& g, g% ~( L
}
3 Z3 }; `" q0 D1 B' T
; X0 l6 ~* N- D; ]: M( J9 d for (size_t jj = 0; jj < vec2.size(); jj++)
8 e {) Z* M0 C1 d+ e! r; @3 T {& M- }6 A" i/ ?& W- h% D" M; J' o1 V
b2[jj] = vec2[jj];
7 c; j" V$ K/ e }
. _5 C- a$ u C
" D, A" E$ p0 f4 w% {3 y //Method - 1 N=100000 247s , @! \8 h! i& \5 ~! V# H% ]! j# |
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
, `1 H- c! q2 G) @! ^7 t* o4 \, P
9 A# t# u( j; v1 ?2 u# I1 A( f- i7 a //Method - 2 N=100000 237s& |) ]) S* N7 {5 I
/*# T% `7 V* G* G* f, e/ D8 U! P
for (int jj = 0; jj < N ; jj++)
' Q9 D! D3 Y3 p- I: A4 h {' T& w! n+ W; w
fresult += vec1[jj] * vec2[jj];
( S/ P: y' x7 _5 R4 I# `6 ` }
' N( j; o. ~, H* l( Q) J& q */4 ]: [1 E- f( b4 z. a# h. u& L4 E/ j. ~
9 n5 l9 ~0 y8 g# i; _
//Method - 3 N=100000 204s
, R. k2 {4 I ?9 C/ I/ Y /*$ N0 p# I+ }# [
for (int jj = 0; jj < N; jj++)% J( m( H r7 n! h8 C: _( v* J, M
{( u/ E4 r! Y* \: F* m: e
fresult += b1[jj] * b2[jj];
3 v% M, t0 G$ P! J- q- g# B/ o }' l) o/ U# ~0 W% R3 c
*/
# ~( F H( }% f
3 [* i6 z0 i1 d n2 Q, X //Method - 4 202s% A* g+ Q N) |% A
/*
- I/ ^9 w- {( e. ]4 ^1 V0 F7 h2 Y for (int jj = 0; jj < N; jj++)4 F8 w2 F' b: L) h( _
{, t( J: y+ Q% q0 d5 a4 q, x
5 s, f7 r3 }3 x* i2 E- D
}( H2 [) B. j4 C+ s# ]
*/+ Y8 x/ m/ {) e
//comment out all methods, N=100000 202s + G6 J9 ^( A# |1 E+ f! a. p
}- B0 E, _9 f- N, G" P
4 ?. l" U4 B) X' i, e! ^ delete []b1;
9 D1 x, P; ]+ [: R delete []b2;
9 s( _# F% w) k' `1 d$ x+ X; e2 G |
|