TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 E! y, K7 o2 B- N4 D! r
" c: N6 `5 f- A- f4 f- O( j) n- @: G
理了理思路,重新做了一个测试。3 M7 c* U1 N$ L% z2 O6 M R
做了两个 vector 和 两个 float *, 都长 1000001 x" e% Q8 z- @2 k7 K! w+ z
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.3 J* @4 U1 s7 a! |% ~3 }
$ r% f9 }$ z9 i$ [" ?内循环试了4种方法,% r" J3 t6 j6 u/ H! U. E
1. 直接调用 vector inner_product 247s 7 \0 C) C( P* d- y0 K) u
2. vector 循环点乘累加 237s- f3 P# H" ]# j0 d: O
3. float * 循环点乘累加 204s! V: }. h0 g& w( Q2 T8 G
4. 空循环 100000 次 202s
* Z4 u9 O0 c* {4 C( {0 b6 K0 I( Q+ I/ q0 O
不做内循环 200s
! P1 f9 G# S& M/ f- j4 n2 k& Z+ `; S! L3 _) r. T
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
8 t5 I5 Z4 Y8 e9 I( W2 x$ B% }另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。1 ~% p! [+ p/ \3 j& ?" r
4 A$ u+ h; B$ _/ f+ K- {$ W至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)5 b- F* ^7 v- L1 O$ f9 V, g
$ z. m3 ?9 U: u: A(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)' b0 [1 v9 T) J! \0 d% R
: a; d1 I6 M3 T1 B
std::vector < float > vec1(N);: g5 H- F% c/ z9 V/ n, I
std::vector < float > vec2(N);9 I' C# {: b& X# d- ~! P
float* b1 = new float[N];1 J8 E% o8 n; _% z
float* b2 = new float[N];4 w* `! p1 J: J+ P
$ A5 {8 s* l$ l3 q5 g for (int j = 0; j < 6000; j++)
8 p3 p. v2 Q' K6 i {- u$ f2 E0 k3 J5 H+ E3 _" x
std::generate(vec1.begin(), vec1.end(), []() {7 a Q% @6 z `! _5 L
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;- c% S' t3 J/ Q* \1 f% W( e$ a
});
0 a3 N" I- N5 Q: @8 s( d' J$ y- n
9 j" E! m- R3 ~' b. k4 W' ? B, G std::generate(vec2.begin(), vec2.end(), []() {: L; |, v% M) w( \$ b4 r
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
9 Z# Z0 k* _& p7 e/ e7 e });5 ]" ~- j# ]# A
: f" x: e1 X1 {9 g/ X- } for (size_t jj = 0; jj < vec1.size(); jj++): Y7 z6 i6 y" i# W
{6 {& _' n. A0 M
b1[jj] = vec1[jj];! l' ?& M( H; P% O
}
( ^* m/ f5 }0 {7 }4 x. j# j- q% ^' _5 e: _; @0 i
for (size_t jj = 0; jj < vec2.size(); jj++)
2 x0 d2 D0 W5 Y6 m {
0 T1 C$ h5 F0 X. P/ u$ ?* p, u b2[jj] = vec2[jj];
1 b' ~- I# V2 ]0 w }
; M( B) L9 g4 @+ Z! V% y
6 T6 E8 y9 u2 b# |# \$ u //Method - 1 N=100000 247s
8 P4 n+ w. l8 X //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);: v E# I6 o2 |# a( m
+ p5 M2 M3 X* R/ |' C& d- r3 i N
//Method - 2 N=100000 237s
3 @0 I5 G. k f3 { /*
7 k+ C: y2 U( W c; s$ C& X5 x for (int jj = 0; jj < N ; jj++), l b6 |* F. R6 W
{1 X) \0 H9 Q0 J3 D, ^ n) S5 Y! o
fresult += vec1[jj] * vec2[jj];3 w! w! ?; k/ J8 |
}
, a" G# @% s' k, `* g */0 o5 T' A# j% q% C
& G6 r- g$ y$ ]/ }4 a! _& s
//Method - 3 N=100000 204s0 X( h( h) Z8 x5 C" D( l3 h
/*. \7 v: d9 }5 F
for (int jj = 0; jj < N; jj++)
( O) R/ |2 R/ R4 R- ~ {
$ P% H" G; l ^' G* `! _ fresult += b1[jj] * b2[jj];
4 ^& Q# A6 |8 [2 G& s# E }
, F/ z6 G6 V7 o/ f$ E9 L3 Y */! ^9 y( p+ L' v; t
% x; E* E* _+ P1 C/ f* _9 i //Method - 4 202s
( B! L$ W3 w, G% X5 q& k: T8 c /*
8 m+ e# i7 @! {* Y7 v6 j for (int jj = 0; jj < N; jj++) Z" l& \; H$ l7 d/ T e
{
3 s I( f% h- j. |+ r# l/ a
1 s" n, B X" L) |0 q, c }- W; k5 H$ D' X' I
*/
$ ` o& T- ~" ?: Z! y //comment out all methods, N=100000 202s 8 H2 M" N1 y4 w m" Q4 @
}. {, O: E7 d( E
" n5 i: ]2 t. C0 n/ x
delete []b1;: k% @+ B, F. R5 R5 V7 W
delete []b2; 9 `' S+ u3 N# N' ?1 B. ~# y
|
|