TA的每日心情 | 奋斗 3 天前 |
|---|
签到天数: 1184 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
) j% g% f; ^* S2 ~+ d \/ {. U" k5 `* E, K# @3 c" C
理了理思路,重新做了一个测试。
6 O9 C) o% `8 E5 I% r2 r9 C1 H做了两个 vector 和 两个 float *, 都长 100000, n' |7 s- f d
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.6 _! S6 l5 ~2 D8 Z0 h0 k7 m
0 V3 l( `* X b C, M内循环试了4种方法,6 w# ]4 @9 X# x5 V1 h. u
1. 直接调用 vector inner_product 247s ' b3 R8 k+ v: S2 c, _
2. vector 循环点乘累加 237s/ O3 l: ]- Y8 v7 U& x+ I
3. float * 循环点乘累加 204s
8 ]( ]& q% ~) H' K7 N# o# u4. 空循环 100000 次 202s
n5 ?3 |% U+ V' }: j' z, L$ Z
2 t0 n1 @. X' m, \& I2 K( M: ?不做内循环 200s
- W3 ]8 B2 x& F* i6 J( k* e
9 b, _/ u- N+ T你昨天说的对,内循环本身占比是很小的,大头在其他处理。+ E9 d' S4 W4 u( a/ `% r; ^
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。3 |$ M7 y" ?$ x9 c- t
+ K! X' w7 Z! R2 Y: A$ p! v
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
7 e o; u6 ~- ~; l
3 N5 F6 O3 K3 K$ L(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
$ ~% O* {5 m% I3 f/ S+ Y4 b1 q$ ~; G+ J9 X5 F* q
std::vector < float > vec1(N);, ~6 W6 Q4 L: C) f+ o0 t4 h
std::vector < float > vec2(N);
5 f* t4 w7 n. t9 S3 k) Y3 T float* b1 = new float[N];
) |' }' `2 [7 K7 ~' w& y5 k, N float* b2 = new float[N];
: j8 [* b' s3 e s. S2 q# ]' O: c* G$ B! x
for (int j = 0; j < 6000; j++)
* `$ Y( B3 g5 _+ ]+ ?& }6 e {
7 J- W9 Y! Q/ _. V ?: q, h std::generate(vec1.begin(), vec1.end(), []() {$ I! \1 p4 o( \# i1 C
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;6 O: M8 O d* N! Y9 s* u
});
. M" r, r9 {: Z% u& _, F
& l" E. O# @! ~7 q, i8 _ std::generate(vec2.begin(), vec2.end(), []() {
1 k! y& }9 K$ E( g. D% w, a return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;# F, u! @" T. v7 T* O+ ]
});
3 z W0 R+ f/ V. O, K' c3 @
. g/ u& ?0 ]( R. l6 V for (size_t jj = 0; jj < vec1.size(); jj++)
$ d$ H- C- K2 g {2 V8 ?3 @+ _% X$ V H `/ G
b1[jj] = vec1[jj];& }; b3 ]& K) X4 Q
}
! R/ T& t O, s8 f3 p
$ r0 X' ?& g% Q. Y for (size_t jj = 0; jj < vec2.size(); jj++)2 T& U8 W, w) ?1 b; t# E5 r, l
{9 v2 e1 }# |7 u$ q1 ~5 D5 h* d# x
b2[jj] = vec2[jj];1 i J, I% V8 _3 H7 e
}
( p( w4 Y9 ^. W' ~5 ~" }5 V
8 c& h6 ^1 u) G7 z* {$ x# i //Method - 1 N=100000 247s
+ b- l- O% f+ q% } //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);* C) c+ j* w- V9 u
3 ~7 }, U7 }& }% w4 \
//Method - 2 N=100000 237s5 x, M8 l( F6 n* P2 j" n' v
/*
3 T4 t7 f% ~' O9 n6 e7 s* x6 g+ o for (int jj = 0; jj < N ; jj++)
) R6 E* n9 w3 o& s) A& z {
7 M) L! @) X4 C+ N" O- w! ]9 j fresult += vec1[jj] * vec2[jj];
9 K8 @' V( _8 T7 d2 I1 a }
p: i: g( K; m: V6 F2 w* p8 |- `. n/ Y */2 k: F/ ^; F- w6 F$ J3 \
# K9 U5 Y+ M- u* `
//Method - 3 N=100000 204s
3 r: X# p% q9 k0 z# _ /*% I7 j9 A; V; b1 `3 ]
for (int jj = 0; jj < N; jj++)
( R3 h4 D( [. t' V {
% u3 C2 q/ ]! i. t0 w* Q7 z fresult += b1[jj] * b2[jj]; t# o9 t* ?: l8 ]$ G& o
}6 `- O* C. i' k
*/
& s! E2 j9 ]5 J& m9 T' D) \
$ ]. b6 W( C3 ? //Method - 4 202s" J, J' f3 V6 _9 S
/*' n4 d: M) v2 M# Q" Z2 \+ @
for (int jj = 0; jj < N; jj++)
: r5 W. m* O" f# u/ s; d3 j8 F {. ^! Z: a) j1 T7 S
0 y" z& b* X: f }3 {3 I3 P! _! S
*/) g; \+ A$ X3 {1 g3 A8 G# F
//comment out all methods, N=100000 202s ' g; e9 }7 q0 Q) N% h* V2 |
}
i1 q3 P6 h. k! \4 Z8 \1 J! g4 c8 C5 ^, V9 N4 D+ F3 l
delete []b1;9 N) R: n+ `( u9 E
delete []b2; ' }' }; Q9 H- m$ F& ?( f
|
|