TA的每日心情 | 奋斗 2024-3-29 05:09 |
---|
签到天数: 1180 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
k$ _/ l5 C* Q8 e
/ ^9 e5 {4 c% w5 s7 Z, [理了理思路,重新做了一个测试。
' Q; B. L% H6 u ^' X做了两个 vector 和 两个 float *, 都长 100000: c9 ~; Q R1 s: z
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.8 y% C: X# B4 d9 K# ~& Y* n
( A. Q C4 ^* r+ \9 q6 k0 o3 o( ^+ |% O
内循环试了4种方法,
3 a6 ]" x9 a/ p9 L6 u" E1. 直接调用 vector inner_product 247s 6 X$ _( f: M8 x5 w8 A
2. vector 循环点乘累加 237s5 T3 g& B" ~- \: G! t& e" B
3. float * 循环点乘累加 204s
' d6 L# G( n1 ~4. 空循环 100000 次 202s
0 ]% C5 g( ~0 g# E# K' z8 a0 z. P/ g( k5 }9 L2 r" T( m+ C* r
不做内循环 200s) d" A9 v) H& w+ V- Z( h( y* f7 C+ W
* b. O) F9 ~5 u$ g4 u" W
你昨天说的对,内循环本身占比是很小的,大头在其他处理。: A$ N& o7 J& s4 Z
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
' v2 C; d! h$ a6 p" ?: n& Z2 w- o! G9 E+ [
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)8 [" R* _0 ]1 {0 i' x
' T8 q2 h7 r* | I. N(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
. u& @& g5 w3 \, ]/ P: u" n2 T) G
' p# s( y/ a2 @: g) s* [' P0 ~* @6 R std::vector < float > vec1(N);9 ]3 ^9 w/ i4 z) a' v
std::vector < float > vec2(N);
* S) I' N6 u! g float* b1 = new float[N];" n) b2 R( p- Z% [/ A K
float* b2 = new float[N];
" r& v2 x6 `- a, Z- l/ d t
+ _9 u" U" d! s3 [* ~# w( p S for (int j = 0; j < 6000; j++)
* L8 K1 x5 @" B0 V {& @: g: L8 M) |1 x2 R2 N) p
std::generate(vec1.begin(), vec1.end(), []() {' s3 b1 k& J4 n$ v6 ~' ^. D4 y. o
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;$ O$ ^. m( D q8 R; S6 Z {
});
0 T1 d( F3 H. T
[. c' Z5 r3 `1 b/ o std::generate(vec2.begin(), vec2.end(), []() {5 [& [2 e: u8 z
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
9 k0 E) }/ [9 S9 B3 E });5 E" n1 x! ]0 C; Z) q1 z
9 I$ j3 l/ \, M- g& Z) _) z for (size_t jj = 0; jj < vec1.size(); jj++), x3 {9 Y0 @; `2 }$ ~9 e8 v
{1 ^6 f, M$ M+ Z8 l5 U
b1[jj] = vec1[jj];
, Q# S4 H; i j$ a# }5 t }4 ~$ Q$ f# k0 M: C
8 _4 d& L; J& j& S5 o( O% k for (size_t jj = 0; jj < vec2.size(); jj++)
4 B5 X% O% N: C5 x& L! ^7 t3 h {! y( V4 a' k+ D) ~& M( Y( k" o
b2[jj] = vec2[jj];7 { S4 ^& f4 m+ f; f5 @
}
3 w5 Q( j2 ~6 R! ?
u9 c- b/ }8 c( ?) t //Method - 1 N=100000 247s $ \" H- e5 ^" a g/ M5 h0 ^
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);8 {3 |5 L$ B1 C
9 f" V% f6 P5 p4 f
//Method - 2 N=100000 237s0 ~, ~5 A3 [, z$ ^0 ]4 G8 |
/*9 O7 \: U9 \' C/ Q9 a V
for (int jj = 0; jj < N ; jj++)
5 t5 g7 H! r1 W, Q {9 g# ~0 a. J! j; |8 p1 n
fresult += vec1[jj] * vec2[jj];* n# p9 B3 T4 A% @ `3 ?6 o, r3 r
}
7 u- } K) w1 w* s5 `& R2 m- |* o# I */6 g) @0 c& x' j% L6 b l, `) h9 p
# R' K: S* W3 X* ~& T2 i //Method - 3 N=100000 204s
8 k w$ e' B9 Z: ~4 G /*
5 \8 U( R$ q" b1 |/ J for (int jj = 0; jj < N; jj++)) p J2 @. a3 T* Q# _, n" [9 e
{0 a' u, {/ G( E( i5 z/ m
fresult += b1[jj] * b2[jj];
- M: `0 J! u3 M+ P }
1 c1 w. v9 ?7 r! c% }* y8 S! D */
4 g/ W) r% F/ i- r# y, D, i. o6 @$ O; Z; `9 b3 V* v8 N, R8 a) |
//Method - 4 202s' ^! C8 _$ S, |: B$ D7 \* [
/*
8 N" m) d/ C1 A$ X2 V- Z1 ^/ T6 ~ for (int jj = 0; jj < N; jj++)$ z. l0 _3 W+ ~
{! U# z" r) ~! [. a; e
; ` T+ c; D6 v8 U$ f. F* g }! ?& s- Y+ J9 A0 m3 C" w8 f9 F
*/: v; \! H3 A) b# N8 L2 S, |. d
//comment out all methods, N=100000 202s
* a! n* w: N, c$ A }
: q3 M; T) p8 i6 F9 |$ c
3 n$ a1 C$ V; ^4 b delete []b1;' J6 \$ D6 ?9 d! u/ Z* i/ h
delete []b2;
- @' c/ i! _1 ^- [5 B' ^+ W |
|