TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 : n- ~% P& e2 q/ [& P
/ u: [, P7 f# e8 C: t1 {+ k7 D理了理思路,重新做了一个测试。# F$ w9 ~, p( m% Z, R3 H
做了两个 vector 和 两个 float *, 都长 100000
* w$ g/ O: R9 Z. X' o3 D% x, i0 S外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
- C* M! D& p- x) M/ Y, ?. |& x% I" G" U( H! X
内循环试了4种方法,
' K2 j# o0 d) a. s7 J" V, e+ R1. 直接调用 vector inner_product 247s
) r: \ o2 Q' L+ p3 X5 M2. vector 循环点乘累加 237s ? L1 H% F) D
3. float * 循环点乘累加 204s' I/ N8 v5 u. a# L! C
4. 空循环 100000 次 202s/ Y9 A z+ P; C, \# L
$ o6 L& _; N# y3 j y
不做内循环 200s1 I/ x" K1 \7 T$ N: B( q/ Z- Y
6 N$ n. U0 H P; N# N, i5 e你昨天说的对,内循环本身占比是很小的,大头在其他处理。
8 s# z R' k0 T$ ^) }另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。6 }) p, b6 q) y9 P: f6 \6 @
" Q4 k# h' c5 z: C: c& Q
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)8 d3 G- U$ r; A. e9 W5 ]' D
5 T3 _; v+ n( c) a$ k% C2 a- {
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
5 b) j; g( a- x K2 W9 J& X d( Z
std::vector < float > vec1(N);
9 ?8 E0 ] a' F, h5 S- O" h$ T* F std::vector < float > vec2(N);
. ^% U* M: i7 t float* b1 = new float[N];1 V: V4 P( N3 p. p" E* q
float* b2 = new float[N];- e4 L3 d2 d( n6 A# g- o5 q9 D1 J- j
+ a$ e" F w P+ ~) P3 e for (int j = 0; j < 6000; j++)% D, Z6 j# L4 D' H& T9 u* L3 f
{
, X7 R# d7 P( A8 J5 u std::generate(vec1.begin(), vec1.end(), []() {9 J! D3 m7 ]7 _4 r
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
, l; G$ i% ~: a });
' i8 T- ` B/ t
6 E4 r0 e) Y& q; j) s, @; h std::generate(vec2.begin(), vec2.end(), []() {: t; d6 B6 j* E
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;/ a; Z, q5 T* P, F8 o. n
});
4 n/ V" j: v/ ~& E5 K$ k
Z5 ?& P3 g. H; ?" c* E for (size_t jj = 0; jj < vec1.size(); jj++)
# r6 m5 g, x( ~0 p6 Q {3 W. Z& H: a! ~( g: \8 k$ N
b1[jj] = vec1[jj];
3 @, r3 ~8 f4 O }& T/ r/ }! V; B% h" D( P
3 x- P* k" j1 Y& e8 L2 n7 P9 Z. N
for (size_t jj = 0; jj < vec2.size(); jj++)+ }& M. h! ]1 h D( c- s
{: ^: L( M8 y* ]7 W( f$ K
b2[jj] = vec2[jj];- N9 ]+ s6 C+ X, n m9 M1 }- g& y3 w
}$ A3 t5 P# {! I. u5 N
* ^8 m" }; Q, _5 c //Method - 1 N=100000 247s
- e- W$ U& ~" f5 x4 x //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);2 z- L, v: U1 n; _
0 H7 P! P$ C! f //Method - 2 N=100000 237s
6 W* S5 O4 g% Z; M! [ /** }3 A% A+ h. B$ j
for (int jj = 0; jj < N ; jj++)- K# k, G" o; t ^2 G1 F
{' H0 c3 F% M9 P7 i
fresult += vec1[jj] * vec2[jj];- N3 V# ?) b0 A9 R. ?' n
}( ?9 i- Q, x3 Z. N5 i2 O; }
*/
/ f; ~+ }- }' {9 S+ T- `) { ) h/ |6 H. f8 ^ t2 }
//Method - 3 N=100000 204s
, [* |3 g& l/ K. s# i! J J /*
8 Y1 ` b0 i* K5 q4 K3 M; J for (int jj = 0; jj < N; jj++)
6 X( H, B2 {3 H* e* m. { {
n T# o' B8 T+ [; x8 s4 \+ ? fresult += b1[jj] * b2[jj];
+ R6 S6 p& _; e% q' W4 ?; |: Z }
& q( {7 L5 M4 q! a$ {/ h# g */
; O) Q/ m2 f' ]. a' P( r* E& [) }* l* H' i2 r' d1 z( ~! P; L
//Method - 4 202s
5 |! `/ f) g2 B /*
% `7 a, p% o/ Q5 q. D for (int jj = 0; jj < N; jj++)
9 Y1 Y0 @3 V. G, ?; U' E/ p {* z. r& U4 o7 }7 O& u) h; C
8 J c, \6 E% X$ } }
3 P: r5 m ^. O *// z/ @: a- [8 O
//comment out all methods, N=100000 202s
1 ?: l- D8 c& U W2 } }! S. W% z+ L5 C- s( X$ I
4 x+ L7 i6 L! |7 W6 V delete []b1;6 W" n, {4 g$ f. m9 s: q& C5 v$ Z
delete []b2;
`) H- X$ m( Y7 C |
|