TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 7 G, R% |$ W; U8 ?8 x, ^( }* n
1 z7 I, P. e8 C# p& b理了理思路,重新做了一个测试。
$ o* e/ j8 M7 K5 I做了两个 vector 和 两个 float *, 都长 100000
+ m+ l( j g- n$ ~3 H- w! G+ h) D外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache./ y* K" E! |& ]) ^) A9 _
" h2 |& { q8 \1 \* z
内循环试了4种方法,
/ M2 C. \5 t7 Q# W! x! g. k1. 直接调用 vector inner_product 247s
" d% r! f* w2 q( Y* b' R2. vector 循环点乘累加 237s* O2 D3 Z" }- @3 I( D& C4 ~' }
3. float * 循环点乘累加 204s
9 e3 Y1 A. C7 l. A k) ^8 Q7 @4. 空循环 100000 次 202s# ^+ L& P0 U6 {4 j5 o$ y
$ @$ `+ t v; L1 P% C) L! [7 M不做内循环 200s/ e9 s6 S( q6 Q% I; g" i; m
7 V' m0 n. V2 P/ Q
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
, h; L5 K6 y- ?1 [$ y% s. C另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。; ~+ J- d) J g5 h0 X; `, O6 t$ K
6 Y' z2 L3 G& q
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
7 L4 G A. Z" C+ m" z$ F+ _: D: W. j% k L
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)7 S8 a* C1 T. \
6 u1 a/ ], ?! j, S0 k8 l- k! i
std::vector < float > vec1(N);6 Y% b/ r z {6 t1 L' F9 [
std::vector < float > vec2(N);3 J4 h" v8 i7 e. t% _/ Z
float* b1 = new float[N];
9 ~ ~3 h" s* K8 C) }: Z% l7 S float* b2 = new float[N];; g( U" `4 R1 F% ~% e# c
( |- Y: R. |# Q, q for (int j = 0; j < 6000; j++)
3 g8 N: M# K- }/ w+ C/ B {' Z& O; q( P, g$ I1 T
std::generate(vec1.begin(), vec1.end(), []() {' j, N4 I' A+ c, Y6 X2 h T! O
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;& J8 N4 a- B7 g6 }
});2 z% p2 m' D; T3 ]+ G6 f
, V! J9 R8 p0 ^* S- f- h std::generate(vec2.begin(), vec2.end(), []() {+ E7 c' t* H* O3 O! Q
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
, f5 H' u3 @/ I1 B" H! f* N# t });
" |$ X+ S; O3 q; p3 a$ E0 X6 L2 B S2 E5 N5 r
for (size_t jj = 0; jj < vec1.size(); jj++)
7 R: S3 E+ y' b0 x" ?$ p2 q* O3 n {
& q3 N4 s: i. v' j4 h b1[jj] = vec1[jj];
H* Q2 x2 Y7 Q5 g3 B) c$ n }8 `* G0 |) \+ x
3 n5 X8 a6 L5 d$ H- x for (size_t jj = 0; jj < vec2.size(); jj++)7 z5 ?+ } u1 d* v
{
3 c0 x6 C2 T# s. T' t+ |( m S# r b2[jj] = vec2[jj];
0 G: [) X1 L- ~9 O: v }6 q; s: E& {" e( w8 N& R
D4 p% V" n% X$ p
//Method - 1 N=100000 247s : g: O$ K S3 ]# @8 T8 f+ F
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
" |( h3 g* \1 g# [( L
: O9 Q& C, K- i' p% | //Method - 2 N=100000 237s
! V9 ]! J: {- I+ `# g7 R F1 a# P9 X# \. _ /*
% Y/ _% v# l2 o3 B [4 Y7 K+ e! E for (int jj = 0; jj < N ; jj++)
& N3 `$ m; E& g4 c! R {
6 m7 ~# {# F @, X% O" P) S% S fresult += vec1[jj] * vec2[jj];0 R$ N* `! c/ r7 T0 z4 ]
}6 \3 \; {" h. w9 V! W5 ?4 c; P
*/2 c; m7 h3 F& o8 H, K
: l( V! ^ Z0 k* c, c. d. e
//Method - 3 N=100000 204s
5 [8 [9 \8 ^# H: @ /*
}1 O; f2 C( |" i. M3 a for (int jj = 0; jj < N; jj++)4 f' b3 [0 K/ `% D3 @
{
! E& ?7 W" J7 q4 W; I fresult += b1[jj] * b2[jj];' L) b# q6 C5 B( @, D( I B
}
3 U, Q, n( }9 E* [4 u8 b+ [( b+ E& p */
8 ?5 e2 }/ |& I$ `* ?1 ~" C% |0 S- a* F8 {4 w# X% K7 T
//Method - 4 202s/ V6 A8 e( b; |
/*& C0 k/ q6 ]) V
for (int jj = 0; jj < N; jj++)
, k x+ h# ?) J' ~( c! K3 S {
" q! _$ V. E7 ~1 ] 6 G' O6 ], ^0 P1 E5 u8 P2 `6 S! o
}. N( M+ x) I$ B0 w$ c4 M
*/' T( Y7 w/ a$ |3 A& Y
//comment out all methods, N=100000 202s 0 f# Q# X7 v i: ^( J
}
Z7 _: t& U( |, _1 L( N# H" s4 U8 h5 l. D6 N1 i- }
delete []b1;5 Z, Z, z6 W7 f, l
delete []b2; ) F, A6 }- U% H; B3 F
|
|