TA的每日心情 | 擦汗 2024-9-2 21:30 |
---|
签到天数: 1181 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 & w, _' }4 J$ W
& G( x3 N, w/ z4 k. `# g6 j" @
理了理思路,重新做了一个测试。3 M$ f( P% G7 W
做了两个 vector 和 两个 float *, 都长 100000
4 t9 @. ?" t8 l; v$ V外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.+ ~" `9 c6 ~! ^! P* u& e
' M5 J! P8 t8 ]9 M8 a内循环试了4种方法,2 g5 y2 i) H1 R- K3 F
1. 直接调用 vector inner_product 247s
& D! R- q% E* C; J2. vector 循环点乘累加 237s# \4 l9 F1 r2 U' u* f' B
3. float * 循环点乘累加 204s. j/ @: x' d$ c' T" A: `
4. 空循环 100000 次 202s
3 j+ [- o: l6 d
8 {2 V* E0 t+ G/ I# Q不做内循环 200s
/ W0 g/ W; t6 q( v: ^" Z" F" y$ A
, @$ V( P' Q9 F你昨天说的对,内循环本身占比是很小的,大头在其他处理。
* o. ^: a J* {1 _" E另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
- c f$ E2 p: X: S5 o' Q' S2 N7 b' j- o
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)7 d5 [ s( f! s
$ b1 A5 q2 e# B, ]$ C(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)5 U/ D2 [# ^7 c9 J# ?
7 a4 z5 b- A8 a# s R' U- e: D std::vector < float > vec1(N);& R. `) C# H) j i8 s4 T
std::vector < float > vec2(N);
/ N- \/ D/ s; H float* b1 = new float[N];
6 A- h! \5 d9 \( [8 y- A float* b2 = new float[N];
1 w) p7 ?) n. K( U+ m6 c9 K( x, ` R9 ]7 v/ A, K
for (int j = 0; j < 6000; j++)+ a1 ]! U3 r: o4 d& r( t3 Z
{
$ f8 k* P& X( |( Z3 z" C( D std::generate(vec1.begin(), vec1.end(), []() {
3 e& G; _" r4 {: z4 b9 k6 R return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
; [ l) R; P; e$ D7 P- k });* G" T( [! i$ K; p5 n' e
& x% U) |. a4 i& l { n0 |2 q std::generate(vec2.begin(), vec2.end(), []() {
" e. n9 z0 u1 {9 r& f( p return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
* ^: c# k9 @- Y" S4 W+ J9 y });0 v5 o* n& G( c2 u3 y! n
% @" l; q- V& `
for (size_t jj = 0; jj < vec1.size(); jj++)# z( @) g7 [/ f! p- w; B
{* a* E6 F/ i# e% S5 }0 l& P
b1[jj] = vec1[jj];3 `! S5 W* K2 n, d
}
' D% Y- ^# j+ k$ |; D4 ^( N: ^3 j$ o5 X. Q. [( f
for (size_t jj = 0; jj < vec2.size(); jj++)$ F1 |! a b' C$ X) h! [
{) `& W8 G' \3 n& ]0 i7 k3 e1 p
b2[jj] = vec2[jj];
1 k# B" j8 \% |: a4 P }
e, R, D- P# A" _3 I, Z) ?0 ], v
- }5 q0 o, E) x. w5 ? //Method - 1 N=100000 247s
! W0 I" k4 O# r; [0 {" A //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
2 `) }# x! R" u/ w+ o, @ x - X3 i V$ y5 w& m+ b$ _# a8 m
//Method - 2 N=100000 237s
1 m* e1 y5 I& o! W8 Y) z /*
5 I; e9 c2 _+ U/ Y for (int jj = 0; jj < N ; jj++)
$ N! F1 U# I+ E5 G. Z( f. a {2 M* W3 W7 ~5 ^- F5 K+ Z
fresult += vec1[jj] * vec2[jj];3 Y# r0 E! y; K; y
}
; J# u' B% M9 g8 D4 c4 Y& K) w */9 w `) D, S& r/ `. o0 l: X
4 B- x4 \) L5 e! C# {( \; A1 b; }
//Method - 3 N=100000 204s
" s. J5 C" G0 Q. d+ H0 q4 Z/ C /*6 L/ ]5 j" k# j1 N7 \7 w0 O1 Z/ A
for (int jj = 0; jj < N; jj++)0 d8 y; g6 _# o; v. e1 t" e6 A) A
{
+ Z8 n$ t' V7 c+ N fresult += b1[jj] * b2[jj];
9 x8 ?. {& C8 z1 t. U3 z* M }" }/ N. D& L5 C
*/0 a' U2 B3 G! j0 N/ y( B% {- |0 Q4 E
; @1 b, j; c' z) H7 e; E/ H
//Method - 4 202s
+ I1 s9 r3 P L5 e# p /*2 @" B' P2 M) s, U
for (int jj = 0; jj < N; jj++)* c. x6 H. \; c, P: \$ c7 z
{
+ n ?- P, D* J: s3 ] 2 v7 v: h0 e6 S% k* \
}
. f0 k) d2 H2 e* ?, J */
, p* |% x$ @7 D9 b- t //comment out all methods, N=100000 202s # y& H5 w& \- L3 d9 S; U4 T9 |6 v
}/ X& Q" f+ B7 I$ u* f) ~: P% ~; o
2 z! s; f0 \5 l8 F& r# G9 } delete []b1;7 g5 y# F' ]7 H/ [
delete []b2;
2 w/ I4 s! U ?2 K( ^% ]0 A |
|