TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
/ J8 f \: w/ i
( y: [ W4 C* s! n理了理思路,重新做了一个测试。6 m; L3 c5 U8 ]5 [
做了两个 vector 和 两个 float *, 都长 100000
) ?$ \& A5 A; r9 o; V外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
0 v9 g, N) d* R! H
1 O2 {. u2 g* T/ ^; l内循环试了4种方法,
: B/ s7 H! H. u S& Y8 `$ ]1. 直接调用 vector inner_product 247s
, d8 Z, I T8 S g9 \2. vector 循环点乘累加 237s
+ q5 Z @4 S5 p5 \0 Q3. float * 循环点乘累加 204s
) k, M( S0 g* M8 g7 ]" |8 j7 }6 @4. 空循环 100000 次 202s
: f1 C. F" b+ K T, ` x- y& E1 O0 F1 M1 M
不做内循环 200s
6 i" A8 F8 H3 Y6 p3 i! F
: z. e' m! R# h$ s A }你昨天说的对,内循环本身占比是很小的,大头在其他处理。, ?- @! o) n* X
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。5 v% \3 r2 \$ f$ r) L( ~
) h& C, k9 B0 W6 q) q [至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)1 c* _/ W& Y# N( B$ S$ C
8 |, f! r. Q& i(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
* \. t0 `* c: K1 f: d1 f
: m5 B# Z6 O+ o" T std::vector < float > vec1(N);
' o6 P; g0 l# r std::vector < float > vec2(N);" f; D- p- U# m
float* b1 = new float[N];
1 C V. h6 ~! T7 P' l+ Y float* b2 = new float[N];* R. S; l# F5 |& T+ l2 N A. @
5 t+ d: F4 w' a' h7 U+ Z n3 _7 _
for (int j = 0; j < 6000; j++)
! a6 v5 l4 U$ P2 | {. H+ ~6 H9 F: s5 A' L7 a. l8 {
std::generate(vec1.begin(), vec1.end(), []() {, T1 G7 O$ @! ?0 S) L- O& ]
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;6 A. b i6 W9 [8 |
});
5 K5 h* S- b/ K3 U }* p/ D0 X" _/ ^
std::generate(vec2.begin(), vec2.end(), []() {' I- J9 @& }6 {0 K: o
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));; g( e1 u0 t( n; r+ r
});$ P! T- o0 O t9 s+ }8 b
. r% X- Y/ I- K9 x$ p1 ~! z for (size_t jj = 0; jj < vec1.size(); jj++)
. l. `# \0 n; L+ P: t, h8 k {
5 [, \7 s& K9 E- v d2 E b1[jj] = vec1[jj];
) q0 i6 L# M" F6 g/ b }
* J# }1 o5 E0 K, t2 v9 l* D' e( v" [ V
/ r/ W b& Q" f3 p; B3 ]6 A4 n for (size_t jj = 0; jj < vec2.size(); jj++)
$ N' g% n, C3 K9 T# G- u u {# e8 T/ \! v$ B1 |& J7 b6 c
b2[jj] = vec2[jj];
3 X$ s. I) u% f8 v* b/ h }
" [, k" c/ E, x6 J& I* z% M
7 B4 }- Y+ c$ m( s //Method - 1 N=100000 247s
4 ^% B2 a8 B1 }. w* R6 N0 N9 y //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
9 M @/ v- o& I5 P: s) w% N# G
- \/ L# T. O2 ]; c9 e //Method - 2 N=100000 237s- u( _2 j0 @+ Z+ Q/ Z5 r
/*9 E: m3 @( D' V$ Q3 m
for (int jj = 0; jj < N ; jj++) ~: }" N" `. R. I
{2 ~5 E7 _3 S' u; i
fresult += vec1[jj] * vec2[jj];
$ X' B# @. E5 R' u3 o$ r! } }6 b& y3 W. }6 y4 [8 H
*/% O, ^" c& v1 z& E
) i% L6 `" [* c" {% I: I7 G8 @7 C //Method - 3 N=100000 204s
' c6 L ~ s$ E% p' D: s /*
8 ~. w+ h# M8 e0 w* E* H' | for (int jj = 0; jj < N; jj++)
a. \/ O q5 B. l# Q1 A$ A {9 r M9 F ], H
fresult += b1[jj] * b2[jj];1 Y4 P' |1 t* {- I0 ?
}
( i. Y, o& `* \/ } */
8 p6 o7 `# N0 J6 ~ Y; M4 T2 X7 R) d t3 V
//Method - 4 202s
7 O, e- H$ [& `# p4 |6 Z' r9 I /*
7 }1 u$ `! b7 t! z for (int jj = 0; jj < N; jj++)
, E7 c3 L* w7 F; r# Z {' t: W! f2 J7 ~4 {, ~4 {- V9 t- E: H
& ?, @/ O( b# K3 D, `. O. r* } }. f( p1 Z- r l+ B7 d; H
*/
* l4 g6 c: m5 Q4 q //comment out all methods, N=100000 202s
% ?$ O a( A- P+ s/ f6 |* A }- V/ d5 `+ S: ?/ k L
$ V/ j# f6 D4 q' K7 g/ V
delete []b1;
9 u2 m% g' d* H/ C delete []b2;
$ u6 f! F! P; G- K |
|