TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 8 E; p0 z, l* X: N4 ]' b
9 o: f9 M& N, M r* w% C理了理思路,重新做了一个测试。; @0 H; s( q+ r, _
做了两个 vector 和 两个 float *, 都长 100000
* g: V' F# J0 ~7 W0 F$ [1 O外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.0 B. X- u* E8 Y
R% G; C+ Q! @6 F7 e内循环试了4种方法,
( q- D- L) c! Z4 @2 U1. 直接调用 vector inner_product 247s
^ a$ ]6 p' Q. l6 d2. vector 循环点乘累加 237s7 Q4 [( F8 k% M+ L7 p6 ?. W
3. float * 循环点乘累加 204s
5 w q: C* w7 ^" r" T4. 空循环 100000 次 202s+ G* I9 O) V3 R0 B. v
/ [' k" ]! Q' i" l不做内循环 200s, m5 i9 Z* C9 G
' |( |6 ` Y5 }; g3 d
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
) z' }1 @1 F8 L4 H7 X另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。3 k" S" U# b8 J0 a I- \. I% I
d. j& O2 K" o2 v
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
: i) @2 t6 J( N4 q6 s2 R
; ^& i4 C" W# k4 J9 t! _(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)5 a7 ?4 r4 n$ j) ]8 B0 _: z8 ?
2 N8 x1 U* `4 T: z! u" ~6 z W
std::vector < float > vec1(N);
( G* \( L6 K4 P2 @ std::vector < float > vec2(N);; e. F9 [% m, H1 H1 P2 q# A; \5 g* o0 D
float* b1 = new float[N];
( f/ x1 I- g) G/ R% y( U float* b2 = new float[N];9 D0 a( }- g5 I# o
1 g8 a. y, Q% |! s
for (int j = 0; j < 6000; j++)
+ F9 Y- P8 K2 |3 I' j; | {
+ n, x4 p# _2 }3 }1 [) W* ` std::generate(vec1.begin(), vec1.end(), []() {8 Q* h$ m0 N- `. ?7 H, w+ S+ s; N6 C
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
9 |8 e5 k, K, A+ b" Z });
& ^+ c) S+ J. _
: s& |" Z+ c% T7 ]" t std::generate(vec2.begin(), vec2.end(), []() {
; {8 C: C/ ~0 R' z# J return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
0 L# w$ B3 d) V8 o" Y) e });
( ^( ^( [( R! Q& ~# d( `1 Y3 M3 m; Q- r' B# I' I* l2 b2 f$ e
for (size_t jj = 0; jj < vec1.size(); jj++)% S2 n2 z9 k g9 P
{9 e: t3 |3 a* L; R: ?9 B
b1[jj] = vec1[jj];) \2 z, i0 F$ I" I6 v
}
4 m, L, j8 t1 I- K! `5 a( r0 \
6 e+ k; d j7 x! l& p- g for (size_t jj = 0; jj < vec2.size(); jj++)
( n& g0 r* \6 W# _' |& n$ O) U {; R2 f0 w3 S. n9 G4 c6 B' A
b2[jj] = vec2[jj]; K7 u7 x8 K6 I0 Z3 i r& d
}) \" I% A N0 ?7 o
2 c; C3 F' h! |# K
//Method - 1 N=100000 247s 8 M! Q- | E. ~- U, K
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
/ Y3 X; g r A' l
; x; }( x* Z' m. r/ x //Method - 2 N=100000 237s0 g S* }3 R4 ^, K
/*
& M& k4 U, G- t5 g) i for (int jj = 0; jj < N ; jj++)
I4 _5 {/ I7 Q3 c7 Z) L {
0 _( R3 j' [2 B$ G3 i fresult += vec1[jj] * vec2[jj];, H* w z0 P# Y5 v) U
}
" q! K) t/ }/ q& k$ B */1 n" p6 C5 @; F! _( H
4 p l3 s g7 v7 q //Method - 3 N=100000 204s
; L6 f9 ^5 |. @) V6 @4 d M /*+ _1 _; H0 X$ g, D- o
for (int jj = 0; jj < N; jj++)
% r- F6 i% _* d# q* m {
: i1 u, R( `) L) A) b: I fresult += b1[jj] * b2[jj];. z( M, u0 g! W* Q" r+ Z) {9 g
}
3 c, ]+ V+ r1 D X. ~ */6 g6 i3 s% W3 f; t; d3 P# E* x$ `2 W* \
& I+ r2 ~( ~9 Q# t* Y
//Method - 4 202s
1 r5 X' [3 D' {/ M; O# u /*
1 q. b2 t8 p2 ~/ W& M; b) t" V for (int jj = 0; jj < N; jj++)# O. w! e0 K+ j% M- y( }
{
( M; ?; E7 S- H8 y! u3 _
6 |( j9 P( A I& D; P8 c: u }; w5 a A& b- _
*/
: `! C. y9 j. b$ {6 J //comment out all methods, N=100000 202s ! t/ M( P6 \' g% A4 N
}
/ K: z( m# d/ Q, Z h$ c7 ]- S n, i: c$ i# U9 A+ J, a
delete []b1;
, r& a9 P' \5 j1 O8 y- ] delete []b2;
, x. u. Z' M7 G! F |
|