TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
' j, j4 M9 e. a4 q/ E3 Y; }( v5 C* @: K; w' ?( s
理了理思路,重新做了一个测试。, c! r/ O2 \! i5 @( U) I
做了两个 vector 和 两个 float *, 都长 100000
/ ]/ Z8 v- W+ @0 K% q( Y) u外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
; y7 u& H$ x0 _: g. g
4 y9 d4 d3 Y/ d2 A/ i- |- Q内循环试了4种方法,
, Y" e: b9 {/ \8 X/ M) f1. 直接调用 vector inner_product 247s 5 ^$ [' J j6 o& y# f
2. vector 循环点乘累加 237s
( t$ C: Z' E$ u, n3. float * 循环点乘累加 204s. s% ?. Q# T/ A0 O9 F: Y- v. C
4. 空循环 100000 次 202s
% y; K# y6 D: y( ]+ g3 O
) C/ `9 a" c7 T9 j2 n不做内循环 200s; L8 X! Q3 J6 E
- i1 I9 T/ F8 \9 i4 B
你昨天说的对,内循环本身占比是很小的,大头在其他处理。0 n7 j5 f* _* n, m2 Q+ g+ f
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。! \; m+ @1 D8 [% P
: `" {3 W( c4 S3 j* r
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)" ^ X N8 U+ E
( W) T! d- L+ S. I
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
! W4 v7 c& s# B* R" Y T8 U
: P: f; x/ z0 }' q% @* ?% y std::vector < float > vec1(N);
2 `: V' |' [5 l* I' |% s( r9 G std::vector < float > vec2(N);
# W# v+ v9 R% A float* b1 = new float[N];1 N: L4 M. _) e/ b9 U6 M
float* b2 = new float[N];
P$ [( {8 F$ p
. |1 m% t( r3 w7 f, q; C for (int j = 0; j < 6000; j++)
?% e, l& ]5 X7 }1 X5 _, M( K {2 V3 e9 _- s2 w' x6 H+ d, Q1 _
std::generate(vec1.begin(), vec1.end(), []() {
+ |4 |' w) I) h" r return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;7 l* E5 X1 U3 o: y
});
, N) k# [4 A+ G9 Q3 \1 B
0 l# P$ b# n6 O$ r# g* j& ]2 a std::generate(vec2.begin(), vec2.end(), []() {% X0 t( m( x! ~, J
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;% S1 @* C4 R8 N3 }+ n5 `% D
});
5 z7 M" W, M2 ?/ H! J! L+ R; h4 `9 d+ @$ `# U4 }/ M
for (size_t jj = 0; jj < vec1.size(); jj++)
/ q$ }0 O' u9 `7 r {+ s5 D8 w/ e) F+ u# ^( l
b1[jj] = vec1[jj];
# H- L$ d5 L+ w3 G }
0 `6 o6 {! W8 s( I! c3 R$ S0 ^8 q- O+ f
for (size_t jj = 0; jj < vec2.size(); jj++), o* A6 S P8 t
{' o+ `, q R- f$ C0 N
b2[jj] = vec2[jj];
5 a8 H$ J5 `# }) J }
/ e7 b& `5 W( m, I }! k2 r
, b; I# m& w, ~ j: s //Method - 1 N=100000 247s 6 O& N9 \7 M3 [1 C- t& g* @
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);3 J. H- U+ M/ K) y
* @& Q7 C" x1 j //Method - 2 N=100000 237s
, D1 i7 K/ l( K' x8 t* g+ [ /*% w- w4 L4 W- t$ i# A
for (int jj = 0; jj < N ; jj++)
2 G* [) F9 j$ R d, D! g6 ^ {
) f& N# r/ R- x$ X) k; i1 t1 y3 _7 | fresult += vec1[jj] * vec2[jj];" C* x: `3 U2 g
}
! i; ]6 ?3 S( E1 ?, N */
, @* O% P* [4 Q! U3 h, D& k$ K" P, P % s! e: F# ~" D1 z
//Method - 3 N=100000 204s# J; ?' m; x' U2 @+ T2 m5 g
/*4 T6 I3 c: M, @) q1 Q' A4 h
for (int jj = 0; jj < N; jj++)4 i- L' N2 p) F3 O$ T
{/ k' n" i# Q7 B& o4 W( b/ |
fresult += b1[jj] * b2[jj];9 n0 ]1 ?# U- K& N
}1 V K! {5 t1 T
*/
# `. ^0 f1 I6 v& L) a% m# E0 E5 P F
//Method - 4 202s
& d# A9 \+ E& u' n3 s /*, ]/ `7 f: ^$ }# u
for (int jj = 0; jj < N; jj++)
( n b" o6 `. f. q9 ]7 b' a% E {; l R, {3 P7 B$ ]* R5 R
1 P3 i& g% w# q8 Z* C3 g }
5 K. X1 ~2 r' _4 h */0 z; k/ }# [1 e/ d4 s/ P
//comment out all methods, N=100000 202s
2 C. u; E: P0 ?: E$ U6 O }
9 P# M" D7 I$ `* j* ]
8 M7 n2 U+ n9 G3 ^" v) B, n delete []b1;. T( z8 n; E" k4 B8 \
delete []b2; ( W; b" ~9 S% E3 t4 n o2 T# J
|
|