TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 - Q+ G# i- V' X* p( H$ l
6 ~' b! B7 e1 ]* S理了理思路,重新做了一个测试。
" F4 q: X) A9 w( i做了两个 vector 和 两个 float *, 都长 1000000 A# s3 n: W) y. f4 j
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache." f. f& Y2 I- R* i- Y$ w, m
# z$ g7 V, l! L( E4 `7 v6 o内循环试了4种方法,+ {2 e* X3 J3 ^% n& O
1. 直接调用 vector inner_product 247s
. Q& D# T- K: ^2. vector 循环点乘累加 237s. Y% ~* e( Q( g& Q+ u: t
3. float * 循环点乘累加 204s
2 r; T$ f7 w |$ z# I5 i; V4. 空循环 100000 次 202s5 d+ K, z ?. y8 M/ R
# Z+ F- l7 H: J% }
不做内循环 200s; o( u: l" s4 {2 x' q5 u
/ c) k: \3 X. h7 a7 O( C( s你昨天说的对,内循环本身占比是很小的,大头在其他处理。6 m) H3 X6 [% [# P
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。: r" \& o; ]! P4 d8 _. M
! x. F- r" J$ S9 X+ j% ]1 J至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
3 W; Y5 t# v Z$ V( o1 z3 m+ N
8 `% B r' W, L2 H2 }7 ](为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
! A# u$ E' X3 J2 M6 O4 z3 K( E( k- K# | h) U2 _* t
std::vector < float > vec1(N);
' `2 S+ z- R9 g6 {; ^8 ?5 i9 u std::vector < float > vec2(N);
6 P4 s4 I: Q" w float* b1 = new float[N];1 E/ |; }) I. i# Z' T' o+ N
float* b2 = new float[N];; b6 ^7 x: C& x! ^6 v' T
$ q) k: `, o) }% p( p for (int j = 0; j < 6000; j++)
2 I+ g2 d: k+ d" g {
% G( ^! s# \7 O1 F2 L1 | std::generate(vec1.begin(), vec1.end(), []() {4 _" i& g' n! ^5 n& f, h$ I
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
0 p- S) B5 V" V8 I. N* Z# X });
; ]- K: B2 y- w) ]( d
$ ~ V) f B, h# t4 X6 h std::generate(vec2.begin(), vec2.end(), []() {
) a1 O' p3 b0 z* d8 @& M return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;# o5 |# {0 u1 I. v- d; k- z% W
});5 I1 q! O, ]. u3 D
- ~/ b. x0 }9 X# [/ W. q
for (size_t jj = 0; jj < vec1.size(); jj++)# C: P0 |6 X T7 I
{) F& ?+ }; O% h
b1[jj] = vec1[jj];, R! l, H1 x. A, l+ s: ^
}6 X! Q6 K, B9 t9 V
- Z( u" s5 Z' M9 z' B7 o5 J
for (size_t jj = 0; jj < vec2.size(); jj++)
% O/ `) o, Z" W: ~- @ {6 r6 a" M1 `! J& d- R8 m
b2[jj] = vec2[jj];3 m2 X. g, ?* |& z* O* K
}; I- v) o6 P Q* t6 f) A( |
1 @( V3 f8 e. d$ w ]2 n //Method - 1 N=100000 247s 1 B+ b* F) n5 S6 _2 g& s
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
& h% X0 u( c+ H8 J+ X " O" P8 ]) D/ Q3 V) D0 z% W
//Method - 2 N=100000 237s
. @6 e4 c1 ?# [7 I /*9 u, y( v* b4 u6 Y D
for (int jj = 0; jj < N ; jj++)
0 y: T. z5 t' E1 a4 U3 s/ P {7 i- `2 w/ h1 z J5 X) `# z9 s
fresult += vec1[jj] * vec2[jj];6 w$ e/ Q/ r- P" l5 o- {
}
: Z# U+ X5 d7 M/ I- t& u# a% P3 J */
) X! u& h4 A4 O! [( C+ u , |/ z9 T2 j1 G8 m4 k9 f& e
//Method - 3 N=100000 204s$ ^ k4 b, l3 E+ ` ^. z
/*' _6 h6 s- z3 r W0 f
for (int jj = 0; jj < N; jj++): }3 u I3 [" R( m3 g# V
{
, @0 g4 L/ b3 u) v v4 l6 N fresult += b1[jj] * b2[jj];; `+ t2 w4 Z* U" F( X
}
* P# H7 h6 p% @ i" [! D */
4 p6 S# X& }, P. a+ E# \' l
, h( j! w2 W: H //Method - 4 202s
& T$ V7 F$ O7 |) y5 ^( s! U j /*. @8 h- Y. T+ x* ]# j
for (int jj = 0; jj < N; jj++)/ `' \4 \& L i8 {6 l
{
) h6 h. ]8 N6 D% r" R 5 G) f* [; P, p1 m) G- Q$ l* C
}
7 f {' ?1 @/ r: \/ A2 }% d1 Q */( w8 L6 [1 w9 y- f% m- F6 k# y- V$ g
//comment out all methods, N=100000 202s
9 [; z; ~' Z$ q& B }
6 g5 z6 H: A& ~# }
9 z2 H9 P% z# H- L) a% p( c" b1 Q0 s delete []b1;8 `) X5 r7 Z7 T3 V
delete []b2; 4 S# T& i# V2 w6 B8 i; z( y
|
|