TA的每日心情 | 奋斗 3 天前 |
|---|
签到天数: 1184 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 0 U: z4 _% g$ Z8 m: ?/ Q* d2 y* n
, A) d3 T* `- Q3 X7 ?* ?理了理思路,重新做了一个测试。
: G3 ^- c3 _9 A4 Y+ T做了两个 vector 和 两个 float *, 都长 100000
6 [& L7 ^$ }+ H外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
! B7 ~' ^5 y) q/ J
6 f3 A% }" U0 b9 d内循环试了4种方法,# g+ W! t4 n; ~* d0 I# d# e/ ]
1. 直接调用 vector inner_product 247s
6 o- l: C1 h# r+ b, k2. vector 循环点乘累加 237s% o) z2 M& X6 v! L# g a
3. float * 循环点乘累加 204s
$ t7 J' n* R3 V4. 空循环 100000 次 202s: @3 T+ }& P3 ~) V" Q# ]" L
# {3 S% g/ O. ]- ^不做内循环 200s
0 _1 Z5 D1 [ f( p: U+ s4 p6 X0 A
$ r1 V/ S2 U d5 h你昨天说的对,内循环本身占比是很小的,大头在其他处理。
& Z- C# J- R* B, J* C另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。2 F, n4 w- {( [) Y3 w1 M4 ?
- S# c9 N+ s. C3 Y+ e/ \" m至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)6 J9 i2 x; F. m' {3 O* w! s
5 V' y, G! D1 W8 f
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
% n0 H2 r0 F Y# W. ?, E! `0 y
& n$ h) D) q1 x) d! \ std::vector < float > vec1(N);
$ ~+ p/ y, Q, k D5 S! U std::vector < float > vec2(N);; C. t0 I2 J+ u8 K
float* b1 = new float[N];
, |7 V. V* U; ?$ a% q: r2 F float* b2 = new float[N];9 f% c6 b$ w2 W* r
7 H5 R/ e: \- k$ A( T for (int j = 0; j < 6000; j++)
7 i: \ R" `/ O- W7 H2 K% k( n7 d {
w9 D! H. G. L4 z0 E8 C std::generate(vec1.begin(), vec1.end(), []() {( m; Y2 H- ~& F E0 T( {
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;+ l4 n0 {6 J$ F; L5 y
}); z. l0 m4 r: v: \0 X5 y
D2 s. o! h; f/ b7 {
std::generate(vec2.begin(), vec2.end(), []() {/ E( a+ b' ?+ [% ~* H; U
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
9 `7 R- [3 O( J });
; I0 v. `' r/ ~" i9 L" w1 v# n& |$ s$ i# ^7 M1 [# C
for (size_t jj = 0; jj < vec1.size(); jj++)
' }! s" X" {5 y {
$ R, C& p' T) L5 a; ? b1[jj] = vec1[jj];
/ |9 \7 {" M$ ~; Y4 w- r$ J }
! o. h) t6 K" ?( V+ M8 t! ?+ J8 |# F7 v" Q1 j
for (size_t jj = 0; jj < vec2.size(); jj++)
2 t8 Q5 K) K3 f {
8 l A! R, p$ h9 W! k1 y( c% \% n b2[jj] = vec2[jj];
5 @0 [' s+ \+ v, w# r }$ \5 V* V/ }% ^8 ~3 l! Y. U
4 ^6 n7 M1 n3 k
//Method - 1 N=100000 247s
! \* P3 Y. }9 z& @; }( J //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
1 k7 H5 |' p2 }& Y4 ]
6 `& A$ G& U) X' V$ X //Method - 2 N=100000 237s
. s) E9 ?! w$ e1 B2 L /*8 V2 o; |5 n: n8 n7 h1 b
for (int jj = 0; jj < N ; jj++)* }" I) `3 y2 w( v8 C
{7 z3 z$ h0 d+ h' @0 h; J6 n
fresult += vec1[jj] * vec2[jj];
7 C+ e) a+ Y. |' \% T6 y, J }
; |3 M [1 F% | */+ J" Q3 Q D! v) A; F ^
$ f9 Y( n a3 U% O% k' I8 D* V0 _ //Method - 3 N=100000 204s+ S) x6 E& ]3 z+ y' w0 k% f
/*2 ^! Q6 e; o" k
for (int jj = 0; jj < N; jj++)
" f I7 R% g$ o) E {5 y2 w7 V7 {% [ C2 [: u/ z
fresult += b1[jj] * b2[jj];# h, y3 z) W M7 K
}
) N) f0 t( E1 U% p/ H4 a) ? */
% ^$ @3 |4 } p) A3 ^
* T L2 B0 e3 W" n" [ //Method - 4 202s
- m% T0 B2 Z5 `/ D /*
+ h+ Y# I9 K; u+ S5 f9 P for (int jj = 0; jj < N; jj++)4 P" m* [# C7 r6 u
{; x1 q- k! P9 N4 c# f' _; |4 y
% H# Q( @1 c2 Q( l' n
}! m8 }% \/ U& \: [! o, D. J
*/
! @* J2 D8 J$ k, P4 G( ]# h1 g/ d8 \ //comment out all methods, N=100000 202s 5 @( z9 ?# C0 y
}
v3 i2 a2 U6 f1 p* H/ v* ~8 ` `
4 |6 s5 w, _# |. P t$ g& i delete []b1;
6 R% i C# Q5 I: X! e, ?% Y delete []b2;
/ v0 B8 p* l* f+ N |
|