TA的每日心情 | 擦汗 2024-9-2 21:30 |
---|
签到天数: 1181 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
2 U O2 I/ }' G, t# c* D
" N1 W9 H" @8 ^% X% k* f5 U8 n理了理思路,重新做了一个测试。
( \4 K8 }5 f! ]" f- r做了两个 vector 和 两个 float *, 都长 100000
# z$ o& i5 l( Q" q% V外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
7 ^7 O8 u1 R. D7 ] W7 B6 d0 B3 j0 V
内循环试了4种方法,* \9 e+ C0 F. b/ n. p" o
1. 直接调用 vector inner_product 247s ) ~6 d6 a! n/ G9 q/ M& j
2. vector 循环点乘累加 237s
, ]# u [7 r+ |0 A' W9 h3. float * 循环点乘累加 204s5 s7 a/ v6 ^% G& ~% F
4. 空循环 100000 次 202s/ T3 D1 @$ Z* I9 O
$ M9 B: `- ]' z不做内循环 200s
O7 J/ H' S0 [0 q% j. @" H! b. ^8 a* O; C" }
你昨天说的对,内循环本身占比是很小的,大头在其他处理。4 Y, L( \8 B* ?/ s
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
# N0 u* |# z" P. y! r( k" p1 B+ m8 _, R- A
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)% _) F! b6 {- R" G$ b
6 u& K& T) s: U
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)& k! P& C) e% J$ v
( _& P( |1 ]" o1 s+ p
std::vector < float > vec1(N);8 h' w! ^$ ~7 ?0 {8 k6 d: c
std::vector < float > vec2(N);" f& _ P, n5 e+ W. Y
float* b1 = new float[N];! X( @0 E+ p: d4 O: f( M9 E) h
float* b2 = new float[N];
9 V/ P, B' ^5 _7 ~3 r8 Z
: }9 l3 z/ ?' D3 H; _7 T9 w# I for (int j = 0; j < 6000; j++)
6 r1 K f8 z- N! P1 N8 g {
9 G% C2 @7 o4 E0 c std::generate(vec1.begin(), vec1.end(), []() {/ |- @- |& B2 m2 H- }8 S
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;3 d. N# c; u: O
});9 g9 r2 Z2 B6 @6 X
- S9 [$ J7 U* Z: Z8 o; w% p
std::generate(vec2.begin(), vec2.end(), []() {/ |0 D2 r! {$ y
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;7 T8 O# `5 j) q
});
# T& p* ?! C; P( D, G9 Q, B' c+ [; ~% ?" u5 U) g. \3 p
for (size_t jj = 0; jj < vec1.size(); jj++)
) z2 A, ]1 ^0 m6 H" ~ {; f- T) m8 F x( _1 D8 Z
b1[jj] = vec1[jj];
$ P- a- X3 @+ ^5 P& x/ P2 ^) E: A }
1 O& [/ N T0 p D# g3 H* D
+ W' Q/ a8 y5 c! C/ W# B. d4 R for (size_t jj = 0; jj < vec2.size(); jj++)
( x5 j \9 E2 x. @* v8 Z {( v' I. U6 o$ X6 U
b2[jj] = vec2[jj];" J) v! d; m5 f1 i; B& o1 ?3 o/ f+ w
}
3 M7 `- {: h# P$ t% S( _2 f
7 \$ O8 W w' Y7 M //Method - 1 N=100000 247s ! r& g6 M1 ], v. T- L% S
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
0 Z/ Y2 m& x; o8 @ - z3 h& ?4 t! W
//Method - 2 N=100000 237s( X/ ]3 l4 I' O8 E+ g5 V
/*
( k5 o* e* ~+ ~ z- f3 _8 x* ^9 U for (int jj = 0; jj < N ; jj++)+ [1 X9 K2 Z0 U: n
{
( J9 o8 E; w7 C; Q, o fresult += vec1[jj] * vec2[jj];: c g" D/ n/ ~; K
}$ |4 k- l Y& ]7 w9 f4 y
*/
6 @1 ^" m4 _3 ~4 _" T) y& R 1 F* l3 V" n& z6 _3 S1 E4 R# P. i" l
//Method - 3 N=100000 204s
' }0 r" w: j' X /*
% \, `" N: @1 l for (int jj = 0; jj < N; jj++)
. c7 C) D O% O- }5 Y$ ~7 f1 x {# `1 j) D7 Z( l M' L9 h
fresult += b1[jj] * b2[jj];; Y+ X. A$ _7 {$ \5 ?3 D
}
7 [6 e+ S# g! q( c */& x" f: b' h1 Q8 T+ p3 c9 Y
% s" o, V% P& W, V. d' ]4 O- _
//Method - 4 202s5 u6 k. |/ p3 f: C' s
/*" v0 s! b! M4 u4 n, @9 `
for (int jj = 0; jj < N; jj++)
; ]$ F# g' E; a# d, |* Q {- C" Z( D0 [' p4 ~! u( w& _+ ?/ L
" J7 M$ X* A9 V! y6 h3 v; g
}
2 @ b! R& L3 C */
$ W* b2 A6 K7 n2 b2 F //comment out all methods, N=100000 202s / Q4 N2 ~& D; m7 |* C( r: l
}
4 n, s) H% |$ p/ t
: G9 f4 X! d" y( E3 f" s0 \7 U* [ I delete []b1;
7 }5 h8 [$ J( i# K& w delete []b2;
. K9 F+ n: n( O8 \, | |
|