TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 ; S, r2 K- Q' o! [9 Q" S. F
- [, z% H, P# A7 m$ Q M
理了理思路,重新做了一个测试。! R, X$ y# g/ [% v: i& F
做了两个 vector 和 两个 float *, 都长 100000
, F8 P* B ~" F8 b- } X, Z+ P外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache./ Q7 b) q ~0 E
# P7 u/ X; y4 X4 X2 N" G0 ^
内循环试了4种方法,' m7 R8 M0 k& O
1. 直接调用 vector inner_product 247s + F- b! U3 V- r" z8 k- Y M, \
2. vector 循环点乘累加 237s# P8 T! a- x& a2 r1 r
3. float * 循环点乘累加 204s& h2 R' P0 V: @+ X H/ {1 y
4. 空循环 100000 次 202s
, T: @' Y& P' M0 A3 i8 M0 V0 j- _" V; _! H6 _* H
不做内循环 200s% N; [7 r: ` b+ Q* t/ E! A
- M# o6 P3 |3 U: ^; z& _- L2 Z
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
% m( \. ^* [/ a W4 m) @另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
7 W2 |8 o& p" |% d. |8 T! x& F) d5 x4 u# U
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)8 u" d4 [) b. R3 ^; e& c1 P+ M
7 h& N" L$ s8 q3 v. S" f% E) A# Y
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)& H2 q5 c; E8 D
% a; l" ~, {5 z; k2 b
std::vector < float > vec1(N);, l. X7 J' s+ x; h) b/ g0 `
std::vector < float > vec2(N);
& }- I/ ^' p- P. y1 z& Z float* b1 = new float[N];
4 ^8 v0 I' M C% ~( J/ C float* b2 = new float[N];
0 V" v- n. g+ G, |/ m/ `( m1 Y6 y/ e8 F' k2 _
for (int j = 0; j < 6000; j++)
" V% j; O0 H; ?% j% ~ {% k, a) t% A4 V/ }7 C
std::generate(vec1.begin(), vec1.end(), []() { t/ D6 w) H e s" f
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;5 B ~# }8 i5 }9 R
});
& Z# Y( ?& M2 F5 K' {0 D8 f/ k
! z9 s. e8 @1 A3 I& Z* ^4 ~ std::generate(vec2.begin(), vec2.end(), []() {+ G% J2 w8 j' [' m9 X
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;' O m- w5 p# z
});: J/ e2 M5 z! q- B9 H) U. Z
* m! ^7 c4 W) C for (size_t jj = 0; jj < vec1.size(); jj++)
- W% X2 P2 n& e% [8 W" @% Q {5 F1 u# R# J# c2 S! M' r# s; j8 f1 [
b1[jj] = vec1[jj];
3 a3 S' w8 h% } a3 o* [4 S/ d( W: @ }
! h. L, L- `5 \# ~
, H" M7 P5 X/ i' x, |( E' O& r for (size_t jj = 0; jj < vec2.size(); jj++)5 i- c0 G% l y5 F5 P7 [: N$ G
{
* R! H M7 f) ?( N+ ? b2[jj] = vec2[jj];: r- a4 P5 l0 A; _4 t
}
, b! c! R9 \: B$ L( ^) V4 @/ u9 H7 X' m0 K0 p2 y
//Method - 1 N=100000 247s
9 a4 C- ?. V" F6 p+ N //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);0 |" ~ F. X% F& Y8 }0 s
( [, t, V6 s# ?: q' e7 m' ~- }# A, F //Method - 2 N=100000 237s
) s- R1 K+ \& S) {. N0 h1 L; [ /*
. k1 s) ~- Y8 t! L9 z' w3 ~ m for (int jj = 0; jj < N ; jj++)
2 u- K) a$ P. h: v {
* I2 Y' s( w: S fresult += vec1[jj] * vec2[jj];
0 Q8 f, T9 u; p8 c }4 |. i, r- }. h0 x7 F" m2 ^
*/
1 X$ X; G( m3 e1 G- B
0 f$ ]# f* T) i& \0 a e. X$ q //Method - 3 N=100000 204s+ e0 ]4 R3 }3 X
/* S$ x+ m& ]9 q; y. C+ z
for (int jj = 0; jj < N; jj++)( n* {# X6 {% G, Z" z+ C
{3 `# ~2 Q2 |" e$ e! l7 B+ H* j7 N
fresult += b1[jj] * b2[jj];: q( e0 L9 E; q% ^( k) _
}8 [. k' X' X* q' B3 T# s0 {
*/
- R: B( k4 _6 g7 X4 p' d( j7 g7 [
N( t) y4 A5 n0 J3 ` //Method - 4 202s
; A0 U* \- w& U; }0 t& r /*# N7 x4 ^; S: o, a
for (int jj = 0; jj < N; jj++)
' I4 Y/ o; H2 O! B5 | {: [/ ^9 ~" w# _
7 N. H0 u8 p/ j* P
}
; @2 I+ Q1 B# E5 T *// `- s% N) _/ }: T* _
//comment out all methods, N=100000 202s 2 J; J- r9 ~* Z f4 ~
}% f* Y" r) A A0 `# K# T5 K
) e+ ?9 A% V0 J0 E* c' s delete []b1;
( C0 `0 k* h; v, R' S( P delete []b2; # V! J _0 Q5 ?8 c' E; o7 `* X8 s& ^" e
|
|