TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 ) ^! v( ]! t0 W' P
0 h: M- l! Y3 _9 L理了理思路,重新做了一个测试。
+ C2 [$ }. s0 d2 t做了两个 vector 和 两个 float *, 都长 100000
8 N7 s' k. E9 ?4 f外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
9 x! Q) U1 J' F9 j/ b. U$ b
9 N S- e2 Y! Q% |8 l; }- R内循环试了4种方法,) I5 z$ J7 E6 l$ Q6 ?& y2 ]
1. 直接调用 vector inner_product 247s
! e' p. Y9 Q2 L+ j0 T5 h3 d/ @2. vector 循环点乘累加 237s+ z) C" e1 t- F/ `
3. float * 循环点乘累加 204s0 K5 J9 j# Q' k) l+ y/ E
4. 空循环 100000 次 202s2 A2 z, |. R! H Y2 d- \
; a; u/ F1 \1 s# U6 o! L
不做内循环 200s
; R( j; y. I+ O# p. k
2 v/ ?& w* T3 ?- J( @: J1 Y/ |你昨天说的对,内循环本身占比是很小的,大头在其他处理。
3 \1 d( q7 u" i8 I9 F% d) C9 t另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
( T3 A, h P& W" I! r# G! D7 V8 R; |& P- v
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)2 }' I- Y6 }. Q4 D; Z; l4 o* t
5 @4 z4 y7 H! _* p Z(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
0 S5 l0 z( j% d/ N4 F" B1 d5 K! o
std::vector < float > vec1(N);
- Z) ?8 m# |' h0 [4 C std::vector < float > vec2(N);
% V3 S) F' t# L9 S/ g7 Y) i3 K0 U2 w float* b1 = new float[N];
) }" \2 F* c8 L1 M7 K% d8 g float* b2 = new float[N];
5 \2 }" _2 a2 V: [* t5 s0 j! v# M5 j1 u2 G: Y5 ~
for (int j = 0; j < 6000; j++)2 J0 j- ~+ [" I( Z0 ^5 N4 i
{; _( D$ \7 C" ]. B6 n2 z u# Q
std::generate(vec1.begin(), vec1.end(), []() {
) g- E* [* m% @/ H return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
' B' P- ?% H% U' k5 P+ x! ] });9 E; T3 J# w' J$ z
4 l0 e! w5 @6 }0 _9 B, D1 Y
std::generate(vec2.begin(), vec2.end(), []() {
2 j( P$ x" s, s( x- a2 ~: M' p; c return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;0 U; n$ J: @2 J- Z9 k) K2 `* n
});% `- \2 i. w5 ?: f: }
) w3 ^2 T: m6 i/ E ~" u for (size_t jj = 0; jj < vec1.size(); jj++)
& _( n. B, g7 S9 B$ C/ l# a$ d O {3 o+ n1 l/ A+ N/ @. a$ e
b1[jj] = vec1[jj];; D, w# _2 x+ o# U! ~
}
$ h9 V+ W' S2 C
, y+ o& g: r# {3 m2 v% O for (size_t jj = 0; jj < vec2.size(); jj++)# X& [- I4 e7 C
{
`" v0 e' y- Z8 u V/ T b2[jj] = vec2[jj];* J! h* R6 _6 v0 M' \
}( Y5 Z b4 M2 T/ ]9 h8 `6 `3 U# H! Z
0 k. q! j! J8 U- E I //Method - 1 N=100000 247s
* o0 l+ R$ O4 }% m //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
4 `) t! \4 F$ n" O0 G , z& |, V M. \$ n4 Q
//Method - 2 N=100000 237s
9 }- u2 r* q* x1 o; y0 G /*3 o( `1 W- T! | P: Y& Y
for (int jj = 0; jj < N ; jj++)
; \3 e7 ` Y7 e' o1 |6 j% l) b) N3 a3 T {: o7 ~& `, K6 h) `
fresult += vec1[jj] * vec2[jj];+ [3 G: X/ h9 {; L6 i, C* C
}' F O2 j3 }# y3 W E# W) o
*/
4 c& J+ [( @( y9 @
" s' X* O, N4 Z //Method - 3 N=100000 204s3 q8 \# c8 e# J* D; O
/*! Q" [+ N M( w( @" e3 x
for (int jj = 0; jj < N; jj++)# B \1 g Z: r6 V) q
{
' k- Y9 n9 L# ` fresult += b1[jj] * b2[jj];4 r5 w4 a; \* Q- T* i/ b
}6 d% K8 ^" c D# L' y$ I! h
*/' _+ I# q' X, m- S1 W
/ K- W. U, ]& ]: c //Method - 4 202s
. I# X7 D |, \: D7 O7 X- D /*5 M# [: n1 v; [4 l4 z
for (int jj = 0; jj < N; jj++)' c: m0 i9 S3 `" g5 ~
{5 s& e* O+ t7 x8 |/ j+ G5 T
' x. p8 X3 s1 D1 x }( j# q3 n+ I( v: Q
*/! i; o9 }, o f' Q4 a+ t
//comment out all methods, N=100000 202s
9 o, y9 l, c2 W. m; l* n }
/ I( l0 i7 s( s/ K6 e) S3 Y( K& y" L
delete []b1;
q1 y" V0 L: C: h# F delete []b2; 5 x. S$ R. S$ t, Y* ?. E6 |
|
|