TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 4 H% F6 s, z; Y' f6 C7 E, S
$ w ~+ k+ d5 D# X$ E理了理思路,重新做了一个测试。
7 _0 C2 B; ~% T- n2 {做了两个 vector 和 两个 float *, 都长 100000! k9 |4 a. F4 ]& @) S( |/ Q
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
. T4 g+ Q$ b. X0 b, j2 H0 I$ ?) r& Q& @, | ]/ L
内循环试了4种方法, Z8 C, @. r; G# A1 h
1. 直接调用 vector inner_product 247s
1 q" L0 Z, M; s y2. vector 循环点乘累加 237s
: ^% q) G6 L4 V$ ~3. float * 循环点乘累加 204s
0 C& [' |8 c7 |5 x L& A' ^& {4. 空循环 100000 次 202s
, a; ]8 }: X2 l; _% ~
; g7 A, |4 F4 Z% ^$ E1 t* i不做内循环 200s
D) V, y. h, _4 K
1 \6 g Z+ ]3 g1 A你昨天说的对,内循环本身占比是很小的,大头在其他处理。4 [/ B, i! c3 o+ Y6 [3 R: d% S9 Y4 K2 O5 z
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
9 I% b E# c& G/ ~9 F6 G, H1 h/ l
0 X3 n$ s1 t- q; T至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)- l+ N/ K( f8 f0 ~) Q
+ w B' g9 w9 o2 ~: z
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)# Z2 x |0 x4 L6 v8 U
5 K) `1 c* p; d) N/ K3 b
std::vector < float > vec1(N);
; b1 g; e9 I9 _1 A1 k std::vector < float > vec2(N);% s& \8 i6 m& ~
float* b1 = new float[N];- [& \7 q2 `" n: w
float* b2 = new float[N];
$ ^! T! {9 g' t- a7 D5 }1 ^% g: b8 w) k# h
for (int j = 0; j < 6000; j++)
! D% i! x: Q; L! }5 m1 _ {- T) i) [# N+ s) Z! d K
std::generate(vec1.begin(), vec1.end(), []() {) D! z% R& E' o* B& F; v
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;5 [% _ N; E! v
});, M0 T2 I/ _! j2 ?0 ^
2 D& r5 b( Y# ~( ]
std::generate(vec2.begin(), vec2.end(), []() {* W" c! e; t s8 b
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;* P8 _3 |9 n0 M% q0 C) F
});4 f: S2 z7 l# N% {
* k3 G; x6 J& a+ Z+ M9 Q5 k for (size_t jj = 0; jj < vec1.size(); jj++)6 c/ {. t4 \6 ?7 F6 V4 B
{
( {7 \* X9 N1 ^: ^ b1[jj] = vec1[jj];; M1 O0 t+ }0 X% S
}& n+ ? t9 d0 x) s! f" e& z' [
/ t* _$ p A( g, K* v
for (size_t jj = 0; jj < vec2.size(); jj++)
& Y) F; l+ I) _ {% D: A% G4 ~( L% ?$ O
b2[jj] = vec2[jj];( @& K+ e0 c- U9 N+ v1 v- y* w
}0 z9 R% `+ G$ ?1 u# y
) U% S& H4 C% B6 S* y
//Method - 1 N=100000 247s
1 e5 W$ e. ^4 w //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);( |1 J$ ^* P5 q/ j: ?
6 p* P0 O0 v0 Z/ n" j' | //Method - 2 N=100000 237s
$ M! C8 c& o; @ /*
) B( d! |" K& k; a8 k for (int jj = 0; jj < N ; jj++)
% O2 U$ W' l1 v2 L# C U7 A" h! k {
; Q; {3 G9 p$ I, ^! g/ T; j fresult += vec1[jj] * vec2[jj];3 F1 _+ v# ?/ {' v
}# j# D1 W5 w s' Z0 r
*/" a% N2 b7 g6 k" A- j4 \
; [6 v! n, `. O9 w A- C# D //Method - 3 N=100000 204s
* b; ]" ]9 g2 \2 \ /*. S& c5 N% z$ }" e- e3 x6 l9 ^
for (int jj = 0; jj < N; jj++)
/ s) X+ x( r1 b. i; C, A/ S: Z% M {
; {3 e* r* e- T3 Y; Z fresult += b1[jj] * b2[jj];
2 l/ a/ W- ?9 x! p: d# Z1 y }) b! M' M) ~5 Q8 Q
*/
5 N+ H9 f% K8 B
: [* ~ G* {. k. K6 l& [ //Method - 4 202s
7 }% S7 u! }* ? /*
) {7 f& \5 B% z' n for (int jj = 0; jj < N; jj++)
' J& O% g6 \2 E {3 X# i t7 Q6 i/ G
/ n: W" b: ~ p' I5 P
}
+ |9 U8 l; l# M" R$ E+ M */4 m p; k! p# R$ d
//comment out all methods, N=100000 202s
$ i9 }+ p' J6 x8 w+ ^5 U* _ }
9 z3 K5 N3 d$ M; H8 x2 `8 z% ?# k/ D1 X( K' _2 D( H0 D4 l
delete []b1;! r1 H. `6 m: U! G9 N0 w4 E$ ^. Z2 J
delete []b2; & q5 H4 L9 I4 y- W" L, n
|
|