TA的每日心情![](source/plugin/dsu_paulsign/img/emot/ch.gif) | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
1 Q0 N4 A7 k9 a$ q5 R& N! d$ U$ a6 C3 R4 j
理了理思路,重新做了一个测试。
0 @3 [$ m9 Q2 v6 s做了两个 vector 和 两个 float *, 都长 100000. q( l5 g% ~3 R
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.3 ]& E! ]9 A& `, X' G
7 F7 e1 N3 U4 F) G5 s- {$ t" O) l+ B# N内循环试了4种方法,
C$ O- k9 G8 [5 C1. 直接调用 vector inner_product 247s
& t5 g [; G, Q0 x7 f/ _2. vector 循环点乘累加 237s
. V( {3 a* W1 K6 y: S! L6 @3. float * 循环点乘累加 204s% L$ z) v% l, X, P
4. 空循环 100000 次 202s3 K; l8 i/ x5 M) s
3 k) S" g( E8 b. A, J; M不做内循环 200s
3 X& }5 N1 j1 Q- g( ]
( c+ }2 n0 e7 ]$ S+ t F. W( V" ?你昨天说的对,内循环本身占比是很小的,大头在其他处理。
$ l2 \; Y( `9 H- l4 k0 p4 T# ]6 O另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
; v: v" L. ]2 s5 D3 w' J; \) @5 ^. Y1 m+ ^9 q4 x9 K1 p
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)9 x4 Y0 Y$ ~5 E. o8 B4 {4 B& w
, D& _0 z# ]$ q2 F( |/ b- u(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
]' J. ] p _, E# O. G: B/ z" z2 s) A
std::vector < float > vec1(N);
; N4 a5 y# i4 l! e std::vector < float > vec2(N);
5 I- N: k1 o3 K/ s+ ]. b9 P float* b1 = new float[N];
- F) ]% W5 \' X, g float* b2 = new float[N];
8 Q4 b- O# k+ U* h$ R
) B- b0 r1 D# X for (int j = 0; j < 6000; j++)
& e/ z: U+ ^# n7 G( b. H8 ^ {$ E: v/ Y5 K5 m( R$ s
std::generate(vec1.begin(), vec1.end(), []() {
, y% D1 k0 W u3 K4 b t# x return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;% `. t; A- l! Z1 Y/ }
});
4 a% G+ d% b1 Y, I5 m% b% ? H3 a/ e1 ], J" p
std::generate(vec2.begin(), vec2.end(), []() {. G. c( o6 u( {+ p( B8 W
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;9 ] x) L1 Y- {3 @% g% u
});
, I# V- C- b& M% m7 K
2 c" s1 q1 A0 Z# j# d1 a0 H for (size_t jj = 0; jj < vec1.size(); jj++)
( J/ [) A! Z4 q, ~3 r6 H4 E: X+ p; H {2 b( e. S/ R) z( z5 U
b1[jj] = vec1[jj];& u. }7 G7 d! F! z; b. O* I
}
+ S* S" b9 H& e2 a+ T( b
: x3 e% Z/ y8 h U4 O for (size_t jj = 0; jj < vec2.size(); jj++)4 A G p. N' I c! X7 O
{
@: Y" s9 n( J; w: A- ? b2[jj] = vec2[jj];
/ F' L$ q3 y' w; L }
8 k( P- b8 [" G+ R8 B) s; I) \& u2 V4 [" Q4 r) S) r
//Method - 1 N=100000 247s % N! x1 U1 C" |8 h7 T9 U1 [' m6 e
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
* Q3 y. {3 r! }# ^6 R
* G/ g, |5 E: b! ^+ F: g //Method - 2 N=100000 237s- S( [, ~- X) ]$ s% G2 I% L
/*
$ W8 r; |& i- j! U# x2 ?4 i for (int jj = 0; jj < N ; jj++)3 B9 g+ e$ I2 N. Z
{$ V9 @( B( K& ^' ?% g# ]* y
fresult += vec1[jj] * vec2[jj];: C8 u* ^; E4 u) z
}
l7 p* E {$ D7 o8 F* n. R */ ]6 q T: f% q" y3 l
' a8 ?8 E3 s/ O. V5 a2 Q //Method - 3 N=100000 204s
; p$ v% b. I2 ^0 D8 S% w# Q /*
, a" t* B; }2 U0 w) [" B4 p* L" v3 N9 r# S for (int jj = 0; jj < N; jj++)" h3 q' a3 U6 U
{: d& R9 |1 \( L( A# q0 l
fresult += b1[jj] * b2[jj];
% k+ n0 d+ `" o% g+ v- V* ] }
( l: `: G+ [! u' B/ G */1 c- I8 P' U5 J0 ~5 y" o! @
4 N/ R" Y3 f; t, P, Z7 D( w( ]3 } //Method - 4 202s3 ?. _2 s5 q( h- ?
/* j# y& f9 V- ?# e0 |
for (int jj = 0; jj < N; jj++)
( K1 K9 X6 T( K( R4 d* w* Q$ j2 { {- C0 r" |0 O( @+ S$ y! Z
: H- N u' X8 i, Y- ?- L6 ~* i }# l. B$ S2 y/ k3 L
*/. Z0 Z9 \# I! M# D/ E
//comment out all methods, N=100000 202s & Q6 p9 Q% y& B8 G8 ~1 e
}
1 X. [1 x) E& W- |' a
! x8 g# c& G& p2 d7 S9 K. m8 ~ delete []b1;
# h7 Q+ P# h) e9 ]# {' Z- Z. _4 u delete []b2; + B5 H9 C2 F: o5 {6 B8 j
|
|