TA的每日心情 | 奋斗 3 天前 |
|---|
签到天数: 1184 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
. O9 z" H% m7 {$ Z$ _& ~' O' D6 V+ n( s: L0 t( H
理了理思路,重新做了一个测试。2 v- ~; b9 ^1 y. q' k
做了两个 vector 和 两个 float *, 都长 1000007 d8 I E2 f+ H
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
* p' n+ N/ L1 J e0 [# f# E7 r" J- E2 N/ i9 ?1 k$ @
内循环试了4种方法,9 ]# n; U7 r* e' F
1. 直接调用 vector inner_product 247s
* f3 I" d4 b/ [- `( K3 j2. vector 循环点乘累加 237s
" |* L1 [3 @/ V! P; S3. float * 循环点乘累加 204s
- g# d; ]; F* g4. 空循环 100000 次 202s/ G2 y5 }! y* V+ D2 v9 g
$ w% s# h" C! @不做内循环 200s: G; s8 E7 L4 l0 g3 C5 r- k1 g
3 p( _7 F( f: g' e! R2 ~: ^& F你昨天说的对,内循环本身占比是很小的,大头在其他处理。% F$ R4 O( N( C
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。# Z, J$ q$ P/ y$ U- ~5 _
0 ?8 o9 \( R6 t3 C至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)5 X3 k- S5 \; V; x: s2 Q
1 S3 a+ M3 I7 K8 C5 p" M4 n# y(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)* T1 u8 S- k* y9 Y' v
) t: I |5 Z' g7 y2 P std::vector < float > vec1(N);$ A% E$ y0 r2 C2 N$ L
std::vector < float > vec2(N);' K/ S. P* j# `. A3 T0 e! o
float* b1 = new float[N];, Z$ h9 ]: U7 M: u8 R
float* b2 = new float[N];5 f' ^+ { b! w! H! m0 D
P6 ~$ L4 U& ]6 y for (int j = 0; j < 6000; j++)7 ~0 J: [( @5 R6 _5 P
{0 o0 N- \/ H. B3 h
std::generate(vec1.begin(), vec1.end(), []() {1 _) _1 [6 M: z5 h/ f$ Z7 v
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
2 n6 K" {0 a$ E1 c3 f6 {2 J3 ~ });
! N% g- j8 Q6 H% ^: [3 t% |
! m: P- o! P9 I std::generate(vec2.begin(), vec2.end(), []() {8 `3 T4 O( u8 S2 R( z- c) \: |
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;$ o4 t$ }3 c4 S; B5 [. o
});/ O9 f5 ?, G9 Z8 ~! [
* C2 _( u& t! ^ for (size_t jj = 0; jj < vec1.size(); jj++); s( u# _# b0 r, u' ?& u
{
! m5 r0 k: n6 o b1[jj] = vec1[jj];
9 X8 a6 F" Z5 {9 k0 T9 ^ }. o8 m: V; b2 h: C/ [7 Q( c
+ y6 S3 I4 y% p6 d
for (size_t jj = 0; jj < vec2.size(); jj++)
2 f, p! g. G9 Y4 n {
/ o. ?' z& ?/ o: B9 i7 O b2[jj] = vec2[jj];
9 r0 q% K* w2 r; u" x }
, p6 h" e. i2 X
8 J h. ?- E: C$ } //Method - 1 N=100000 247s & z$ G; p: r2 V/ K: l! n
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);6 h, `- r; M+ L' G* i0 [
# h* p" j- b: @# [/ t9 ~" E e //Method - 2 N=100000 237s
2 F6 G! e8 N/ G/ D1 c1 f+ Z U2 t /*. ]( l/ S- {1 t+ S% T: i( D
for (int jj = 0; jj < N ; jj++)5 _# N! e2 |0 x1 C/ K. o! k" t# }
{/ P2 j0 S: X9 _7 p
fresult += vec1[jj] * vec2[jj];
5 N; f! ]7 r2 n. p+ H- e }
2 K) \3 [/ i% t1 D. b$ F" Y, A b */$ T, ^- C- q9 L" G! g; r
# Z- @. |# V0 e) g8 v$ x' _8 v2 W
//Method - 3 N=100000 204s
7 |* `5 |' C1 V" X. b /*
" J$ D$ U$ G6 V. p/ H/ F for (int jj = 0; jj < N; jj++)
' G# R6 u6 B' K1 z% A3 | {
5 l. c# ~. [3 q6 o" F2 e; j fresult += b1[jj] * b2[jj];
2 O' ?+ W2 R4 ]5 M7 W/ g }
/ H; b) C4 b! p+ Q+ C4 C */+ I+ O8 _' x" ^
8 O u" r3 k3 Y; j
//Method - 4 202s
4 n- p* `$ A2 H0 `( D5 R, y" L /*/ X7 q1 N+ P8 M/ v: y9 p
for (int jj = 0; jj < N; jj++)
. k* d0 p! u8 p2 v {& J; U. P R4 O Z
2 i6 P/ y* m" U }# a7 i: Z) I6 f
*/3 {, \/ R* ?( d2 Q2 l5 O
//comment out all methods, N=100000 202s . C8 H2 P4 l) W% \# J' k
}
0 K; t: z/ [: x, h! b8 g* v6 a. S8 H" p. \0 f2 ~4 L
delete []b1;
8 m) J5 ^. N; t& K: C* ` delete []b2; ; V8 c) a. E0 Z+ r& P
|
|