TA的每日心情 | 奋斗 3 天前 |
|---|
签到天数: 1184 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 ( I, V6 a9 v. M" F" y" B
' ^; H. ?1 X+ }9 ^- V, m; E; E" q
理了理思路,重新做了一个测试。 b' n) I# Y5 S: R1 o
做了两个 vector 和 两个 float *, 都长 1000003 l6 ^1 n" Y8 L8 ~; [5 e" ?% T
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
4 q: f( j3 f( c V* E ~$ K) _9 `8 U# S, Q7 _4 c# Q
内循环试了4种方法,2 e& r B9 e* E
1. 直接调用 vector inner_product 247s
2 R) Y) [5 J) m# ~4 t( o" m$ F2. vector 循环点乘累加 237s
4 X3 Z' E$ o% m7 ~# \: x3. float * 循环点乘累加 204s5 ~; {- G# [( E' ]) \- S i/ q. r
4. 空循环 100000 次 202s: [* h3 o; I7 V- |' }4 d
. N7 T4 h# ?, g9 {
不做内循环 200s
) P3 X8 s( D% T: x+ n# I1 I' |; Q
/ |& W' _0 _5 _6 l9 l你昨天说的对,内循环本身占比是很小的,大头在其他处理。; C/ {% B. z) [7 J3 v9 h3 K
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。4 `% m" m9 g3 ~( |7 G% j
) a o' d8 Y# \7 Q: G
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
. n) C; U# G4 T$ |
o4 F2 d5 S F6 s v(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)% p' L! R1 r1 F' W& c
/ }0 u, Z0 D' X8 W) f" h
std::vector < float > vec1(N);
3 F3 o5 R% p* J8 B' Y std::vector < float > vec2(N);& w% O+ `3 y" A8 Q
float* b1 = new float[N];1 C- O H/ _- c2 Q, U2 A
float* b2 = new float[N];* {2 q, O1 f) z' Z; ^6 e
, M B- H( ^; Q8 ]' }& y, l for (int j = 0; j < 6000; j++)
% s& p# H" A$ ~: e! Y/ M, A0 k { q [/ _' G/ }* ^
std::generate(vec1.begin(), vec1.end(), []() {" O8 j" @# z+ p
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;6 ~ R& n8 U2 {$ Y' g
});4 H& c2 i/ e- g J+ X
, V. h9 ]+ r1 @6 \ std::generate(vec2.begin(), vec2.end(), []() {& x$ C/ o. N8 \$ L, p1 g6 o; \
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
0 X9 }: L9 @/ X });
9 I4 u( m# C7 j! N# j
0 @: p+ j ?' f for (size_t jj = 0; jj < vec1.size(); jj++)
2 ^# B; _: E6 W# Q% p) W [4 t9 N {
. [8 y7 Y; P7 \2 I3 e5 J4 G b1[jj] = vec1[jj];% H# ^; w a! r
}
: L5 e9 [. k1 e
$ I. V; O9 l; Y/ b& ] for (size_t jj = 0; jj < vec2.size(); jj++)0 z1 J3 c' O# Y
{9 n, ?8 X: p9 C) P7 n' C I1 f
b2[jj] = vec2[jj];
4 q0 Y: \ H2 e! u5 V1 w }. V- g X: Y$ ~* z9 }* |6 I7 j0 }
2 {( A! e" O1 I; E' p! {9 p$ k3 F' } //Method - 1 N=100000 247s
7 _6 Q: ^1 N: T //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
7 t: y2 {8 I" R# C# Y6 H. j
6 \5 W3 J+ P3 {4 a8 E4 o //Method - 2 N=100000 237s
8 U/ }) a! u1 Q4 \" m% f9 P$ p1 s1 R /*
3 h, ~8 G" {1 l/ U for (int jj = 0; jj < N ; jj++)
& \- p% J9 `) H J- p; | {, S* |$ F0 I/ O; F
fresult += vec1[jj] * vec2[jj];
# X$ D* V& O6 b; [2 i3 I' }! | }! i8 N5 b0 O0 ]6 m: |* j$ R
*/
' y4 H5 ?2 D6 r6 b- G' j
$ u6 b m: n& O- S1 X# i) y5 f //Method - 3 N=100000 204s m9 W6 N. d8 [0 u' q
/*9 y) H0 K, u: o3 C# w7 [
for (int jj = 0; jj < N; jj++)
2 x- `5 y: ~; M1 ^) H, o( i {
( U7 O! b3 U/ S1 f; z& W8 T fresult += b1[jj] * b2[jj];4 I5 w. l& r- a2 o' X2 {1 U
}
0 p1 p h# d6 r( U3 l1 q6 g */, C" Y' l6 g7 [) b1 R" Z$ k9 c+ {5 }* s
" o' o$ L5 M; U! z, [
//Method - 4 202s
0 G; [. N' c& Q/ G, U6 w( s1 _ /*3 y6 c2 t8 X4 u& k# [! @
for (int jj = 0; jj < N; jj++)
9 d5 q0 [2 y; F0 B3 A {' {& z1 {1 b1 t
. Q, e6 H0 F7 ?. `
}
( X) |/ [: {/ H4 W3 z */
D! y v/ |: T6 Y+ V# } V //comment out all methods, N=100000 202s s" Y. ]% t1 |5 s' ~* p
}
@/ i- z r, f! f
# n; D/ _# x, X& k delete []b1;
$ O2 h5 W/ B* p) p delete []b2; . S$ U( e; F" C! P. } s. i
|
|