TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
! Z9 v% j, Q8 i% A$ I `. y
7 K( D3 R2 I! v6 A理了理思路,重新做了一个测试。" b7 z/ O6 U2 W2 P: f. m. N
做了两个 vector 和 两个 float *, 都长 100000
4 n9 F- J; I" d外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache., p2 d! z0 q, W3 I" m, R- ~" `
8 `3 J2 W) v2 a
内循环试了4种方法,: ^' Y% Q3 W) w7 C
1. 直接调用 vector inner_product 247s
# S* B4 b c* l9 b' e# \7 y2. vector 循环点乘累加 237s5 o, w4 O3 v6 n# ^' |; Y# d
3. float * 循环点乘累加 204s! q: v6 Z9 x4 O3 p# `, f, p
4. 空循环 100000 次 202s) X T9 L. ]5 [" ~+ W
. y8 ?# U8 Y8 D4 V+ O" P, Q: l不做内循环 200s& U* G4 g' S) T$ C# Q
; n5 }- \& M# N8 n! d" f你昨天说的对,内循环本身占比是很小的,大头在其他处理。
) n" c& H; P ^* N( P& I3 u另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。! f3 c( V4 g: Y _
6 r4 P2 n) m$ E# [! m
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)9 ?& d) L' ` @& F3 |
+ g% h0 @& i1 [$ T
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
8 J v/ P0 T4 C0 b6 \0 r+ v2 D0 H) L/ v( a9 C" B6 x
std::vector < float > vec1(N);
) I& z1 g5 w8 U8 z/ L std::vector < float > vec2(N);& U1 H) b: w9 V6 [
float* b1 = new float[N];
* A v, ~3 Q) c( ?9 V float* b2 = new float[N];; e7 n% C. W2 A& V, q: l# R
) J% f8 N y" L$ M1 |) q, v) q for (int j = 0; j < 6000; j++)
( n4 F- L: _; H* D4 O8 ?5 M' r {
" ?! ] Y; g" o, U9 d! ] [9 Q std::generate(vec1.begin(), vec1.end(), []() {- G ]& q* [ c2 d8 ?7 r5 O
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;4 d3 \1 P0 v8 K3 |: f7 H
});
8 b; j" G, C, a1 ~ ^; u+ u1 w2 K; i( W, X) E$ Z( S% X
std::generate(vec2.begin(), vec2.end(), []() {* T! K1 L z+ m9 c. R
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;* B# X5 K$ b. f' V$ h( K/ K# x
});
" D7 _- l% g) T- F' |- T# ^ B' w# c, X
for (size_t jj = 0; jj < vec1.size(); jj++)
( h1 o. G1 `, c/ P7 K, U {* ?6 D. g9 e$ S6 T+ y& j
b1[jj] = vec1[jj];( ]. n* e5 @% N7 ]* Q, j
}
8 n) B. o. i, L v2 V! N8 b
& R8 T7 M8 g+ k8 ~( M1 Y for (size_t jj = 0; jj < vec2.size(); jj++)% _; G. ~; x7 t2 g( D
{( ]5 }+ F5 n; J& L3 e* b9 n- p
b2[jj] = vec2[jj];9 @; b2 _1 }9 Q+ `: D" E6 E
}+ T' N$ P8 I1 l3 k2 y
* e/ u" _8 W1 T) W N& @
//Method - 1 N=100000 247s & H7 X+ l! ]- t1 I( I4 b6 }6 L
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
9 `7 g3 q. }9 @$ k: h. q+ \
/ n# H! a) G; u //Method - 2 N=100000 237s
6 z7 y# R5 y# O /*
* w' m/ b# y6 h7 T: c# \) ^, k/ } for (int jj = 0; jj < N ; jj++)4 |; e$ e. u0 z
{
6 j8 v5 q/ C& w2 Q fresult += vec1[jj] * vec2[jj];
9 T" |2 X; Z9 V" G3 X( m }. ~ V5 l) c' n% i0 _1 F3 ?
*/
/ G! W$ v+ U, G O! k1 Z, _
& W& ~/ S. [! O3 b //Method - 3 N=100000 204s* `5 F8 B) S9 ?9 w
/*& F2 F) R( F* h, ~
for (int jj = 0; jj < N; jj++)
' M$ h0 G! Y" v, C {* ]6 j3 d9 y, C( J6 i4 O, c
fresult += b1[jj] * b2[jj];; W6 g* Q* ?1 m+ y3 w7 O" U
}8 l/ g% @0 m$ [! X2 V# \
*/
) h& @2 B* O. O @
- m8 w/ H @7 q, ` //Method - 4 202s+ s( f( \6 N5 x6 F+ b+ j1 f$ W& @- L
/** [& _( l. b' K5 Q
for (int jj = 0; jj < N; jj++), `4 Z3 v4 {; g: E7 U' o
{9 Z8 p0 n; {# Y- s8 R R
3 l+ a: }! h" m1 g }+ V4 v, m m# _# n
*/8 C- `$ T+ K- x' s
//comment out all methods, N=100000 202s
- W" d a6 C X0 ~, \% j' K }
; q, L8 M( J# R2 a t
$ X, i: W: e; ]# v0 Y# P delete []b1;
1 [; L4 i# v, a( X delete []b2;
3 x( A. T' @7 ^- S, k9 R, T |
|