TA的每日心情 | 擦汗 2024-9-2 21:30 |
---|
签到天数: 1181 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 2 T; ?# Z, R' F8 v2 u4 G
2 |. V8 ?8 S" G' N7 \" G理了理思路,重新做了一个测试。, y, x n1 d' g1 R; X7 b
做了两个 vector 和 两个 float *, 都长 100000
. ]. _1 ~. B& ?5 I$ z- _外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
7 v! J5 V2 e4 X/ S( L( \ O
3 w+ g5 ]; e; Y! o2 p/ ~. O8 t H) U {内循环试了4种方法,
/ b: e3 E+ {- W5 g0 }1. 直接调用 vector inner_product 247s
# V. s& l' }( a2. vector 循环点乘累加 237s
5 Y$ L& F7 T" H1 p3. float * 循环点乘累加 204s
' V, l }" P5 \- e2 I9 t4. 空循环 100000 次 202s5 {- c. p% Q$ K
/ C# D2 V; Q: a2 I I" L不做内循环 200s
4 l. g3 z5 i& A* U' `+ U
& A$ k/ [! U1 z) ~0 \你昨天说的对,内循环本身占比是很小的,大头在其他处理。$ o8 h! S* F5 [3 W- Z, Y
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。& ^% S, L6 l. H% z, a# N5 M6 U
# D% {3 r) j$ m" Y' L7 c8 M" V7 u! |
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)$ }% X/ p: A, b
) O9 N8 A3 h. S- `: o y(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)7 Q) _+ O. s% p
0 i3 h L4 D) _/ s! t6 ~ [" H
std::vector < float > vec1(N);
% S9 @1 K) { i; ~- K2 M: q7 T std::vector < float > vec2(N);6 p' |: o' M9 x: p9 R1 C! C
float* b1 = new float[N];% t% k: z2 f: I
float* b2 = new float[N];
0 v$ g. ^& s- ]% q: M
& y) t0 c7 p$ V" b; p for (int j = 0; j < 6000; j++)7 d9 ?6 g, M! A$ M; S0 Y% x
{- f& k" q- n3 W! T1 P+ {9 I+ p7 J' O
std::generate(vec1.begin(), vec1.end(), []() {
C% s, R; V, { return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
) p& H$ r5 `/ ?, G$ F });
* V4 i; S- I0 \2 h5 T5 Z @& x2 a& T" R3 U* a
std::generate(vec2.begin(), vec2.end(), []() {1 u0 E: z0 b2 |% N
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
, M% [4 N4 m8 Y });
. d/ q. H0 T7 G. T1 {& |/ M
U. [) j- d0 A1 Y+ S1 i4 V) ~ for (size_t jj = 0; jj < vec1.size(); jj++)( i: r S8 ~: X5 z9 s2 C
{
, e8 t. U6 u0 U' Z. A( Y; Z b1[jj] = vec1[jj];
# e& _ Z# G& Q0 I" E* K }
' C$ D0 `/ L+ W" E. _
. j a$ x8 N2 E. Y" E0 G! }& J; \ for (size_t jj = 0; jj < vec2.size(); jj++)
6 F8 } B: s5 r6 g! ]! T {9 ?) @$ X& T/ s3 ^
b2[jj] = vec2[jj];( w# \' T- d2 i/ [1 [
}
/ C8 J8 Y) E `" g0 M/ p9 m& `. R. y' s- E
//Method - 1 N=100000 247s : C- I1 N: K! s+ W2 H1 b
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);$ j& C+ ^. b8 o
; m6 X* ~$ W( d
//Method - 2 N=100000 237s
) p3 Y" Q: q& ?# y' S /*( ]6 `# s. p4 d: |
for (int jj = 0; jj < N ; jj++)
5 U+ ` ^4 u( M( Z {0 E, d3 M l7 d
fresult += vec1[jj] * vec2[jj];
( w) h3 c7 z. H! E, ^' ^ }* s' ~- n L$ x) {
*/
* L+ U- S5 P. s& F- j+ N
9 a2 }' E. M4 ~0 h! D" T2 y //Method - 3 N=100000 204s# u7 R# B* t% N- o' Q4 }
/** t/ P7 u1 f4 [
for (int jj = 0; jj < N; jj++)
5 Y u4 w6 z' B6 M {- e7 Z$ Z- c" w f5 ~
fresult += b1[jj] * b2[jj];" B. z2 E4 d0 K) v9 j% ] j
}
6 e: R5 |6 N3 C" |5 T( t */
- \8 @0 G7 w5 v& {7 ]8 i+ e0 ]; O1 N1 f: \2 X% w' P' T
//Method - 4 202s& S6 n; H, j3 c' Z& V- @
/*
2 G/ d [0 ]) W1 {, @( I for (int jj = 0; jj < N; jj++)* a7 M+ V' f3 `
{# B6 s* R( T& Y# p6 W# x
; U2 \1 x% i' Z
}$ U/ L/ ~+ h4 ~2 E: z$ v" f2 U
*/+ y; \6 E6 _5 T, l
//comment out all methods, N=100000 202s
* B4 r: s+ {, c4 x1 |# N1 h, l# D }
% a% T/ \$ M s1 p
# ]+ _4 \* {! w+ Q: C) T delete []b1;6 M8 C) b# v/ F( a
delete []b2; : [" q- g- b( Y+ x
|
|