TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
8 v* Q: f: q6 q4 U0 w- T) S; m3 E( D6 v2 v) f7 m! a
理了理思路,重新做了一个测试。
0 ]9 |: _2 i# X% ]: {. @& p, l做了两个 vector 和 两个 float *, 都长 100000
D% j3 i$ Q( x# k/ M外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
9 L# r4 d8 U {) s* ?% h* R5 D3 D: t1 h4 b( J% F& J7 z$ N4 P
内循环试了4种方法,% a2 E, g: Y: j: x6 t! c
1. 直接调用 vector inner_product 247s . O Y: M. Y! B9 S2 x n" R
2. vector 循环点乘累加 237s
. \3 s d8 T4 ~8 @1 ]% Z3 r3. float * 循环点乘累加 204s
+ u) [9 F3 {# Q7 g& p" a7 D/ m4. 空循环 100000 次 202s. z/ P) V, a& r( U% |' N
0 R2 h/ r. o6 n5 j* [* F; V
不做内循环 200s
1 `8 z# o- H, o! G3 ?$ ~ x+ F8 r. V/ U- L$ m7 f: A
你昨天说的对,内循环本身占比是很小的,大头在其他处理。9 v) Z7 d6 B9 @& j2 L. [ ^/ w
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
& n% z& C( Q! s3 M2 T) I: ]- @% L. u% \4 V8 ]: M
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
, F. P8 z1 W* s. R
' S; {! \/ } u& B(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
7 e9 r4 H% x1 h7 v7 H, D0 A9 ` _8 v+ c' ^ {9 K/ r" ~! D
std::vector < float > vec1(N);* Q4 }! [& w0 ` Z+ d* i# i
std::vector < float > vec2(N);
# Z0 M+ o) t, P float* b1 = new float[N];
0 |# R4 S; @1 i/ a$ q0 w float* b2 = new float[N];# V) v( c+ _4 u* C+ ?7 ]! u h
! M% a- w$ P: G
for (int j = 0; j < 6000; j++)8 M2 b9 A: P" z& c+ r o
{
, `: j8 }9 s6 f! v/ H0 ] std::generate(vec1.begin(), vec1.end(), []() {1 {; W+ L* y. Y3 b& W
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
3 m! g4 D% K( ?$ m/ F* | });8 N2 I9 G- U$ A
! b5 R. N0 m* d3 q' L8 y
std::generate(vec2.begin(), vec2.end(), []() {3 C0 }* M& e+ l0 ^
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
* b2 ~2 b1 M! @ });
/ F7 l: z/ c$ c- o% R8 P
2 V" I5 l! W$ O! z: ~( }$ [/ Y% e" e& Z for (size_t jj = 0; jj < vec1.size(); jj++)$ h) X' C$ {# l! U, P- i" G
{! M- T( L T2 p" K
b1[jj] = vec1[jj];
3 m: m9 {1 O9 m0 U3 J2 x$ H }. E# k* O, q+ r5 V( l
r6 U% c# j) f( V5 K& M for (size_t jj = 0; jj < vec2.size(); jj++)
. R- ]8 t9 P0 I# q9 U6 u! ? m {
1 P- n' q1 A, j# S% w, ]; x3 a: S# N b2[jj] = vec2[jj];
: T& o. }% M3 i6 O }* n% \# x$ x0 h9 o7 |
+ ]) m% M5 i& u0 ]6 F0 [+ R //Method - 1 N=100000 247s ( n: s: }9 F" d& d& d: F3 g- e3 _
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);3 q& z, `& f0 k5 C
) `' W; A9 z! j U+ X1 F8 a //Method - 2 N=100000 237s5 e9 _) P$ j) Q+ @2 {' S: Q& i5 r
/*0 h7 I- Y9 s1 U$ ~2 I' [
for (int jj = 0; jj < N ; jj++)
* b5 d1 }9 h" s5 a2 ~8 Y0 Z {$ v( U. h' x. W3 y/ X
fresult += vec1[jj] * vec2[jj];; H& U7 N1 C1 r- `
}
+ E0 D/ \0 l- h0 k* |- }4 g */
! L. ^* L2 R ^6 V e 4 y8 R& e5 ]- R7 K& v+ Z% Z
//Method - 3 N=100000 204s) o+ Z6 V3 A. C& W. ?5 ?/ o: R
/*
) G3 R; i1 P& a3 L* F4 m' |/ C, J for (int jj = 0; jj < N; jj++); \3 R! g* G$ p* K, }; H; u7 r
{
, m) j$ k* @( k' C fresult += b1[jj] * b2[jj];
" w7 A, S+ v) B3 h' z& t" ~ }
! m( a% O, B5 I, S6 M. C& j */0 {+ c$ v" n6 @7 t
% v6 e$ P/ I5 o4 _# f j6 k //Method - 4 202s5 B$ C6 L. z" k' \/ W* x
/*
3 v v( a/ Q3 H4 v& A9 f0 o5 _7 B for (int jj = 0; jj < N; jj++)
$ J) V' W0 G2 A/ r% l; q) q {$ g) ~8 {% O% y7 L: }. I4 f
! S* y( z' d& k9 P& ]8 f8 Z R% X% Y
}9 u/ A Y8 A. l$ x# ^; W% w' Z
*/5 X8 h2 F0 n: d6 P% I" x3 r& k
//comment out all methods, N=100000 202s ' _; y7 w6 r1 W! g/ Q* i0 C
}. l& R. D7 y( S$ C: O- o' b8 T
8 T& J* U7 a5 B [) a9 H delete []b1;; f+ q5 [$ m* u8 F
delete []b2; : G6 a$ n+ } z- M D' g
|
|