TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
) E5 [4 ^4 A; p; }6 ^$ m) l3 l: y+ I- e! x3 B9 o# k
理了理思路,重新做了一个测试。
9 B# T, T5 P' }# D; c) Y* q做了两个 vector 和 两个 float *, 都长 100000* X, d @% d$ t ?- b) o* j3 C' l1 {
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
$ R I" Q' |/ [8 \. i' a$ h
" c( c0 R2 `( I内循环试了4种方法,
, \3 A3 ` ?" _1 X/ \& D1. 直接调用 vector inner_product 247s / a2 B& N# x9 I5 `2 v
2. vector 循环点乘累加 237s5 H) b1 E5 W+ x9 N9 o
3. float * 循环点乘累加 204s3 ^) D- [, }/ L/ l9 X: S% h
4. 空循环 100000 次 202s. c2 x4 h- W. m. r
9 U" ~6 ]) T9 N& a2 |9 x/ \) U j
不做内循环 200s; o+ P9 q3 c: F i5 d6 T% l3 ^
9 }- d$ `6 E, B0 W; Q% S
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
% b6 H2 L! b" M' Y另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。' p G# R4 V: G) r
' a- L# d+ I9 c8 Z
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)4 c5 H4 p+ M. C1 y) G
$ E1 B2 R" D3 `0 @5 P(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
2 }( H4 `$ s4 m0 V# P9 i: j8 e+ \8 ~ S- w
std::vector < float > vec1(N);7 o' L) _+ Q l8 {0 h8 S2 I: `
std::vector < float > vec2(N);
! t7 ?3 k1 |& }- \! A H float* b1 = new float[N];
. E E8 g; `( e3 ~" ~* t: t* n float* b2 = new float[N];
! W1 Y# w, J6 C7 `/ ~) R. n* E X6 V
for (int j = 0; j < 6000; j++), n+ h2 `: v" E9 i5 p
{# ]$ K) J9 N8 @* x* r- E% N
std::generate(vec1.begin(), vec1.end(), []() {
2 V" U+ {% p2 n0 A return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;$ m' _% X2 e1 o4 e
});% r' K' Y7 { s) T
( n# ^9 k; @! P% h4 O+ O1 w6 B% M$ [ std::generate(vec2.begin(), vec2.end(), []() {! a! a* o. M( j* p1 ~3 Q
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
/ g7 H, j2 G* A! S9 |+ F8 p }); e" Z0 X l) v4 C. A/ p( A
" H0 o# y5 o7 y for (size_t jj = 0; jj < vec1.size(); jj++)
q- A" F/ ^% W% u/ @ {7 @% D. v* J3 J2 t
b1[jj] = vec1[jj];
8 E5 {' L0 Q8 a+ i& J6 s+ X }
% M: k3 t3 o( _5 G& A: P1 ?0 P7 ?9 P! M5 I4 E
for (size_t jj = 0; jj < vec2.size(); jj++)
& f7 J4 n. J, D- [; i& b( B5 _ {# X8 e$ W0 Y3 R2 v+ g9 }
b2[jj] = vec2[jj];% h) r5 j: y1 q& R0 ?6 d
}9 a8 T7 H/ }0 [% e' f0 s' v1 I
, [; L2 U3 {) Y
//Method - 1 N=100000 247s
1 G- Z. u" |) x: U: p. V) v) P //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);; R: T2 r5 N' X. p2 m' ]6 I& c
* B! f2 F, J% C9 ^, l% e% H
//Method - 2 N=100000 237s3 M8 N" R& Y4 _" }2 g8 d0 [
/*
) _( Z9 | R( P; z, Z; H for (int jj = 0; jj < N ; jj++)5 e% ? R9 S2 h& H! ]1 v# S1 A
{2 [5 R- V- C0 u9 a) `
fresult += vec1[jj] * vec2[jj];9 m9 |( i3 g! z. u1 @$ Q0 V) v
}
* U" b$ n! j3 g8 I/ R */2 ?" U) E) }; y
; n) E0 [* v- E) y+ K t, s( a
//Method - 3 N=100000 204s9 ^3 w; `' P. S; d6 y- {; M/ ]
/*, ~# r/ @- k9 \- S$ l
for (int jj = 0; jj < N; jj++)
6 L4 s' s4 g! w( T {
8 S' }4 y, J- _5 w* b$ a' {+ E fresult += b1[jj] * b2[jj];
# ~2 r( \# k7 _7 b% p( d, S5 [3 Z }
) W5 G6 ] m5 {7 ^% l */
8 `3 K; I8 N4 \- t4 A: p" o
0 T, T0 E! Y: E- Y! } //Method - 4 202s2 n" |. N8 M! q7 K% P
/*# T1 a8 Y# t, s) t- Z
for (int jj = 0; jj < N; jj++)
% `, L! U {( Y6 W3 L: r" g. e {
7 t6 F3 y" i, D5 v) y4 l. M* H
0 E4 {) S3 d# t+ ]# a. V% b3 n }" X5 f' E9 p4 K* u2 P) _1 ~
*/
5 s4 B" [% D* u! P //comment out all methods, N=100000 202s
$ Q5 E5 Y+ x0 [& `7 [ }1 o, G0 {; H" _, B0 L& @3 [" e
& l- W5 c5 _, n" m. d
delete []b1;
/ P, }$ S3 T% Y) o2 b# E# }/ p delete []b2;
& `. ^: _. @" \ |
|