TA的每日心情 | 擦汗 2024-9-2 21:30 |
---|
签到天数: 1181 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
- o7 }: z1 ~, ]6 q* A
$ C3 G/ | r4 t0 T+ t) G, g0 R q理了理思路,重新做了一个测试。
8 {' E0 p; `8 E做了两个 vector 和 两个 float *, 都长 100000, N7 { A' o/ H/ l* K$ Z9 }
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache." j% t: D# d I
7 _; j/ B6 y$ M n: s/ }
内循环试了4种方法,4 h( a- v- l; q
1. 直接调用 vector inner_product 247s
: j5 P ]* [9 L h% `2. vector 循环点乘累加 237s$ \. o% D' [% N5 H8 v" y
3. float * 循环点乘累加 204s
4 Y; ^6 t( i U0 x$ D r6 i4. 空循环 100000 次 202s
9 ^ ^+ A5 ]. |2 \9 e2 J1 n9 l! g2 j: L0 b) o: n
不做内循环 200s( I- ~+ A& o' |1 L+ U
; _- x' `7 P2 i% }( P$ m4 M2 U
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
6 U9 o8 w1 C- Z+ L1 Z2 |另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。9 F* c& F( h! X
" L6 v( E' Z- g# e" x5 A% h2 r
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)9 o) }# D; L2 @* R$ t
) m8 S" N5 y( T3 Y" [
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)( S a3 o O( d- a5 \, I1 m
# `) b3 [7 w9 g: L; O- s std::vector < float > vec1(N);" w& D! C! x0 P2 d! V
std::vector < float > vec2(N);
# j5 @1 \ v$ L* ^1 y float* b1 = new float[N];2 e2 I2 j8 o/ E. H6 \! [
float* b2 = new float[N];
! t/ W, [2 c8 s
' b$ H0 q/ {' \2 d) l for (int j = 0; j < 6000; j++)
7 i1 U" c9 q5 n% J* l E/ l {
& L* E, \/ z0 ] std::generate(vec1.begin(), vec1.end(), []() {
: k; S( B0 B. `2 y( Z return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;4 \, K, `5 S& Y
});
1 ?/ o7 c; m3 C9 @; a7 B3 o" y1 ]
( N4 a" W' z# z! \' Z- i, { std::generate(vec2.begin(), vec2.end(), []() {. X8 X" M4 `$ K1 q7 ]" A
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
8 _' s- R% s& {9 s/ M* F. ` });' h! i3 q$ V- k5 }3 U2 Q8 h
% _$ G3 k% j1 X p( p0 L# h; \
for (size_t jj = 0; jj < vec1.size(); jj++)
) j: |$ h+ N3 a2 w {% b& N# i( B' T, T* X
b1[jj] = vec1[jj];
8 u V1 u3 {3 e- ~ I. ~5 [& P }4 G+ Z) V; J5 A& ?2 k$ J% d! W7 B
9 a/ I3 R- G. Y6 B* s for (size_t jj = 0; jj < vec2.size(); jj++)
7 o. ~2 W; d+ ^ {
3 B' q3 _ X# R: A7 [7 ^. t b2[jj] = vec2[jj];1 b8 }- H& [) D2 u3 x
}
" q& s7 F4 `8 r
' ?+ Y0 X5 n( c$ t: D //Method - 1 N=100000 247s
9 ], G' w `0 m //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);' T+ m& A5 p% R7 k
8 n6 O; S; {0 {9 E7 s% Y+ X/ g
//Method - 2 N=100000 237s* H" M0 A7 N' Y) R8 H0 v
/*9 j9 H+ _5 P3 X/ s* ~, X% T
for (int jj = 0; jj < N ; jj++)
n9 S b# f$ G" h {
6 c8 j2 b7 X3 |& L. _ fresult += vec1[jj] * vec2[jj];
g: p" P, R$ j }
3 k8 r% E; V& [ _* v5 \. Q ` */
! P4 C6 R$ d4 @7 d) n' \
8 q# G' ?. ~' C4 a, m. E! n' E$ s& P //Method - 3 N=100000 204s
3 S) [5 S2 F# x2 C5 \ /*
4 L% J6 F- u+ N8 X, n9 K) P2 G for (int jj = 0; jj < N; jj++)
' a0 U9 _. T% I0 v {& a1 y: p; t- w" |# Q# q
fresult += b1[jj] * b2[jj];5 E. W: N* ?& [/ F% t
}
: y4 q( Q8 z2 v* {( {4 } */
$ ?: n6 B$ o* C- |) @; h0 E! j+ }8 P$ v% n/ ?6 |. j( i
//Method - 4 202s
& y! v4 ?- ^6 U' _) h /*
* s, J- w; V9 s# B, M for (int jj = 0; jj < N; jj++)
! K1 L, U3 x7 H3 T/ l {# o) S6 ?0 _* s% G& j+ a
3 e' | K" q! ?3 Z/ i& ~& J }+ |* j7 c; S3 E8 ], S
*/
6 b }& b6 y3 a7 L/ l7 K* f //comment out all methods, N=100000 202s ' ]1 M# n' i _' E& a( }, H* c# T
}6 M3 C3 Y% B* f" `' H3 ]
# o! d# A" t2 w4 E9 G+ r& V% G6 ]& H delete []b1;- h5 ~; a3 \9 i7 @1 t0 ?# Z" y
delete []b2;
2 Z( {. d) ?6 a; y! K S |
|