TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 P* n& h' k! {, i
' u: K. j" T0 l, A8 ^) Q理了理思路,重新做了一个测试。, V$ r( d! i- {% a: } C
做了两个 vector 和 两个 float *, 都长 1000000 ?- P5 }, E, N5 Q
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
0 @0 c/ s0 l5 Y7 u( f+ B6 j
! {$ ~6 Y" \% Y. n% k内循环试了4种方法,
) e/ U; p3 r7 c- t1 ~2 A0 k4 O1. 直接调用 vector inner_product 247s 5 `0 G7 [- ^7 v: j Q2 k1 Z% W
2. vector 循环点乘累加 237s! L1 B2 o1 b: T+ O2 b
3. float * 循环点乘累加 204s1 h, s. _* K+ Q+ [! S4 w
4. 空循环 100000 次 202s
# v, C: Z+ j# _* o! J- a
3 L1 R/ T$ T' C- Q) z不做内循环 200s
5 ^- _' f( _" e& ^) m% S# y
0 w* N2 p Q, K. Q+ b" O# y你昨天说的对,内循环本身占比是很小的,大头在其他处理。: q# A ^+ ]9 M# t3 y0 H
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。) Q! k. I) A6 v, E5 `0 c. u
/ F0 d2 Y5 f: C
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)' x! G( Z. P7 i
2 U& j! P2 [( j' T* x _(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
% v( U$ W- e4 L; v6 w& T
2 ~' [& V/ Z+ @- x3 U std::vector < float > vec1(N);( g# \7 v. y% e2 A% D
std::vector < float > vec2(N);) \! ]6 y5 `+ Y7 o7 a% m
float* b1 = new float[N];
( X/ R+ w2 K4 G% j4 I8 Z float* b2 = new float[N]; S! w0 |4 X! t( s- a8 n. L" G
) ~5 ]9 R! y% B& T, i
for (int j = 0; j < 6000; j++)
5 i6 J- g' W1 h" u$ Z. o2 _' T {" G% T, ]) N# ~+ M/ Z
std::generate(vec1.begin(), vec1.end(), []() {# ?# g6 Y! \- D. x U0 P
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
/ n. H: h. O) ] q. V });! a) p. ^9 e% q& F
8 p7 D8 b, T: P3 r. C6 O, }0 Y5 w std::generate(vec2.begin(), vec2.end(), []() {
, U1 |/ l8 z+ I5 ]2 v4 _, i8 X return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;- }* u. r' j9 I8 [. c$ ~
});6 A1 U& l9 g2 m( `; E
% t2 w" L* b4 D9 K3 \. a ]
for (size_t jj = 0; jj < vec1.size(); jj++)
$ I8 F. v2 F8 ~( m( w; X {" b9 E4 w) `$ u9 g
b1[jj] = vec1[jj];4 y2 T7 c6 c% {4 Q
}, G- V" { H+ e4 f! V: w: j6 Q# Z
# L8 R' x8 ^4 `6 x& F
for (size_t jj = 0; jj < vec2.size(); jj++)
; {# s3 S$ Q; G* q {( x1 Z) M4 W' C' h$ [+ e
b2[jj] = vec2[jj];
. o9 X5 J2 n$ B! ` }
! C; b* u) P9 P9 u7 d f5 l! T9 h* P1 g( B2 J
//Method - 1 N=100000 247s
' {9 ~0 F8 [( {3 ` //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);4 N4 y+ ~9 _% c. R- i" x' p
9 D2 v9 i) T- d# ? //Method - 2 N=100000 237s
' f0 f5 C H0 k0 w0 T& @' Z /*
, r$ ?0 M8 T9 [* \% [6 [ for (int jj = 0; jj < N ; jj++)3 {0 \7 e% D! w; d. H- f- L
{: T6 ^- w% T% c
fresult += vec1[jj] * vec2[jj];
5 n8 h: B! H3 X% G }
1 @ M- G+ U* s8 L */1 w, R3 C" G5 k* f
- @; g$ `' f- F3 _ //Method - 3 N=100000 204s, n+ h2 ]& ~! k8 ^
/*
, J# H7 U# |7 T8 H% n9 f for (int jj = 0; jj < N; jj++)
7 x( k) j/ x* P {% J9 [& u/ i) w# S! m+ x
fresult += b1[jj] * b2[jj];
* `4 }! o5 ~9 | }3 W, `6 A) ^3 W2 X& F
*/* \- c% K0 {. H9 T- I" w( P9 Z
( p* B& ?7 ^! U8 S1 L( q- o
//Method - 4 202s7 K$ Y5 b: J; H& b6 @7 ~
/*
s, Z! Y9 F: k k5 V. J for (int jj = 0; jj < N; jj++)! q. ]2 `3 h. _ s# ]% V, w
{2 C, b4 A+ _5 `1 C4 C
3 w7 p9 E. S# L
}2 I7 ~# L2 V) N3 r# }4 X( ], S
*/! R. `' i1 P5 H+ L
//comment out all methods, N=100000 202s * E: q3 M) e) G, V! g# a0 u
}
5 ]& H8 M( }9 C+ A g6 p3 N$ O; i& o1 V. n" h7 j" I& e+ N
delete []b1;
; Q/ x8 Q3 s+ i1 C. D3 G8 v' {7 F delete []b2;
) X6 ]6 P) n, p$ V1 j/ j |
|