TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 1 R( B: e5 a7 O& L# b
; |" y3 f H* M# h {' s5 [. z
理了理思路,重新做了一个测试。& E( ~5 l4 t( v! I" \+ z
做了两个 vector 和 两个 float *, 都长 100000
( h2 t: `. Q3 e# K外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache./ r0 u! z o! Y7 u) M( C( r: d
% c7 @9 }0 q/ p2 y内循环试了4种方法,8 i" e" ?8 Y/ E3 d. r- b+ V
1. 直接调用 vector inner_product 247s 8 l- l" s9 r+ H: @8 R
2. vector 循环点乘累加 237s. _" U: W/ f8 B( a
3. float * 循环点乘累加 204s
* {4 h& d1 A9 e- d4. 空循环 100000 次 202s
! {0 J5 O4 I8 a1 U5 n; L0 l
" f" J: z0 Z6 e3 D" {9 c不做内循环 200s. i* A/ F, V% w) r# }# N
+ T; V2 j% c- s t. {你昨天说的对,内循环本身占比是很小的,大头在其他处理。/ [$ v2 u: Y, F% D) r
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。7 f8 e2 \6 \" y- i6 d5 |
- y9 f1 ^% Z) x. W! i$ G5 [至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
( A& O2 n j" c9 \- l! e5 }7 p W& k5 K
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
' T& G+ S. J! ~- O5 w0 `9 i
1 \4 i6 M8 h% G. @ D std::vector < float > vec1(N);5 Z9 d. B9 \8 g3 y$ _
std::vector < float > vec2(N);
- {5 x; s' w) K9 {3 b7 i float* b1 = new float[N];
+ ^9 K3 O! M2 [4 G float* b2 = new float[N];0 s* ^! j' ? x0 U) C1 h* \+ X! }
, r& R! z5 s3 `1 {- M: j7 |% y
for (int j = 0; j < 6000; j++)
% c; _8 e7 f' Y9 G3 b G2 I {
( L- g* }3 R6 J. o( A std::generate(vec1.begin(), vec1.end(), []() {4 @$ x- _, y1 s9 s7 i
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
8 ?7 G1 n9 r: ?+ q; f });
( q/ f w2 n+ M9 E I; {& X) `* H' F& X' \9 [8 b
std::generate(vec2.begin(), vec2.end(), []() {+ B' ]& ]% \+ T! E$ l
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;, Q9 e3 ^6 {! Y) U: s
});) U0 J& I& Q! o9 e7 m! g3 e3 A
: G% q, M4 b) v I$ V5 _ for (size_t jj = 0; jj < vec1.size(); jj++)8 b$ N. b0 b- I" [ I0 ?
{" }8 q- j1 S. ~( M% \* T0 R1 {
b1[jj] = vec1[jj];6 y$ {' G3 H4 O
}9 u3 f8 ?# m; a+ W! `3 G) b3 x+ Z
9 n( r* [! o l* z for (size_t jj = 0; jj < vec2.size(); jj++)
_( N1 k# B5 \( m( `# W! \+ Y {3 t. t9 ^, O. R7 x
b2[jj] = vec2[jj];
6 G( L! @& m; K" [, O7 \ }& Y7 z; A! B D X& Y/ ^% N
( y# x/ o$ r \8 Q# C
//Method - 1 N=100000 247s
, N/ d3 U; v% b" U //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
0 J, `/ P: A7 b8 r2 N2 ?8 C! N9 l
/ c, n# B! Q6 Z$ r- S //Method - 2 N=100000 237s j7 J1 m }) e; K* R, l! \
/*
* _ L/ i: V8 A; _8 x for (int jj = 0; jj < N ; jj++)
' g7 B2 B9 h6 w( S* {$ } d6 [ {' E q3 Z6 o! H6 B. g0 ^6 T
fresult += vec1[jj] * vec2[jj];
* e7 ^- e, R, ~ }
9 j- |2 T, _ Y7 e */
9 g/ i6 w" q6 Q. f* G
" N: N$ `, ]3 @+ l& l- v5 w1 r+ F //Method - 3 N=100000 204s
# |; z- z% f0 j% U /*5 x+ v# T; H) C( a# C$ n9 y+ |
for (int jj = 0; jj < N; jj++)2 v. p' m- p1 s# R7 d
{5 x2 U8 `+ f7 j4 Z+ K
fresult += b1[jj] * b2[jj];
' m4 \ S' x! x }
! \+ _% w0 ^+ E5 _" {. U */5 W7 C; b) G, r9 B$ u
$ D6 K0 z; \9 {+ R //Method - 4 202s' T1 M* l, c# h+ D2 L
/*
P5 [$ x& m. r o O: d for (int jj = 0; jj < N; jj++)6 ~: G1 m' w% H& ]6 K
{
0 h/ M4 N* G0 M/ l
' X' X2 e) \' I }) ^, I/ {% e# t6 f: h0 }) \' d
*/5 R7 w( S, v" o+ b' F% y( b' C
//comment out all methods, N=100000 202s 9 G! W+ N. U' x$ T8 r& {& t. d P
}- ~7 }+ O. ~8 D- V
6 O( d3 z; S: n0 s/ j5 l
delete []b1;
& x3 w0 c6 l# y, V( e5 e, \! b delete []b2; + _' |6 {6 C; ] j5 C
|
|