TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
2 W) v+ c& {+ F& ?& r; ]& R
6 n1 P$ O7 G8 {# J3 a$ U8 U理了理思路,重新做了一个测试。- B/ C( z0 R- w% z ^- s8 ~
做了两个 vector 和 两个 float *, 都长 100000
) u7 G: @: ~3 x3 Y$ T. u外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
' D7 T, @* g- l' G/ g2 H: `+ Z6 p+ K) ~0 L! _8 {. s/ j, }
内循环试了4种方法,
3 {9 v" {9 A" D/ X0 k1. 直接调用 vector inner_product 247s 3 }0 c1 o2 U$ \- ~! Q. f& \
2. vector 循环点乘累加 237s5 v( @7 m3 @3 p- p) K$ b# S
3. float * 循环点乘累加 204s, V5 e8 Z# e$ t5 f& C
4. 空循环 100000 次 202s, j; w2 S2 A$ {9 [5 g* `/ c
- h/ ]6 g) Q N2 `/ ^
不做内循环 200s
, p( f2 g0 Y1 j% M
, n; O: x# v' i6 [' z- P你昨天说的对,内循环本身占比是很小的,大头在其他处理。' b- a6 F4 \1 [( S
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
) f5 [# D7 a# f0 e+ {& p( R, U+ c1 I$ D
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
& x; ?1 j" d1 V1 x: C: R* j9 s6 S5 y2 U
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL). k" C$ L$ W2 I! T, t5 O
9 j: s# {* Y6 n: E
std::vector < float > vec1(N);
0 A5 K W2 w% [( m std::vector < float > vec2(N);% I$ B3 B. G+ O# P$ p k) F
float* b1 = new float[N];$ T6 g7 Q4 s9 G9 A: ]. r' Y
float* b2 = new float[N];) p" g) q# x: S
8 m) d0 `. v3 h) z3 ^) i7 M: ?) g for (int j = 0; j < 6000; j++)
5 c! I1 m7 D* E* S2 d/ W) N# c {) V7 A0 K9 L; Z
std::generate(vec1.begin(), vec1.end(), []() {4 F e1 z, M+ S3 ^$ k0 j
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
* u* M( U4 B' t) b# c1 T });
( q1 N) i J/ f/ w ?# `
0 e! T$ h3 G* T+ i5 L5 ] std::generate(vec2.begin(), vec2.end(), []() {
( f* e# S% Z* u2 z' ?/ r: y return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;3 d0 b# R9 F9 `, t+ e: e$ L
});
: J' p6 a' V5 k0 G1 [- a. l& `; s* x/ ?# g
for (size_t jj = 0; jj < vec1.size(); jj++)
% K) i9 e1 m" ~ E {6 C3 D2 J% q# F! S8 ?& K+ {* V
b1[jj] = vec1[jj];
" D" i5 S9 {# n9 Q( H! s; E }
) b9 Q$ L7 o# c' c" s" i
, N, b5 B* c9 d- d" s, W for (size_t jj = 0; jj < vec2.size(); jj++)
5 G4 O5 |+ {8 ]8 X& e! O2 } {2 ~ W1 U2 A% m5 C% |' U
b2[jj] = vec2[jj];
, [4 ~" {* J y c3 O' Y0 P }1 S& Y" }0 `' y4 L6 v; w2 f. u
* E: e7 A4 N' k5 W7 W. k //Method - 1 N=100000 247s ) ~9 _- p, K, h& S: E
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);; g' ~* i& o2 a. {7 Y
/ t7 O6 f8 b b
//Method - 2 N=100000 237s: r- b2 k- \% F
/*. w7 z9 n, h }
for (int jj = 0; jj < N ; jj++)
0 s$ t) P$ f1 |/ z. D {' K- N! s9 }! t N; m. y
fresult += vec1[jj] * vec2[jj];
- I2 o/ a+ e, K' D8 p, h$ p9 d+ @ }( {5 L j1 O0 n* {0 W/ ?5 v& R
*/2 Q: S; @; ?" G9 v
9 u. S# e. R: g/ r$ c9 g& r
//Method - 3 N=100000 204s8 z ?/ b. _# C: f, n0 K3 l7 w% I
/*
0 ^' D5 R7 ?: {; }; ^$ Z for (int jj = 0; jj < N; jj++)
S+ `; ]" R7 _0 e {7 s. G* Z- W' ~& j6 m
fresult += b1[jj] * b2[jj];
]5 v/ x6 Q# r. ^, @- D# g }
5 M. z- U) E- a* N */# s9 }: K9 }3 S
* z8 ~( s& x* q" j" f$ n1 u; S
//Method - 4 202s/ v6 B$ z8 M+ c1 a; B
/*
2 G: E( ~' r8 j" d& k for (int jj = 0; jj < N; jj++)8 P% M) K- n: {4 | j) P
{
6 B7 ?/ S8 s- c& I- w ' s3 F& a$ R* H" R" `* U% ]$ P" ^5 m
}
/ c& r3 A2 p2 { */" r; q' x% m# p5 G
//comment out all methods, N=100000 202s ! \. g0 f5 E" a+ F7 e1 K
}
U& g' y* a- z- ~7 z Z6 r
$ _# |( Q) m4 e+ U delete []b1;
$ N U+ t$ e; ]3 k& ^; A1 \ delete []b2;
2 E+ w f3 b6 d4 C |
|