TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
% H: F- d2 H( T/ V: A; f$ W) |" F. f% L! Q/ w r2 a- S
理了理思路,重新做了一个测试。
p \# W2 [' V# k/ g2 E6 Y- g做了两个 vector 和 两个 float *, 都长 1000003 _; q0 H5 m B' O8 w" v f
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.2 L- R8 W ?5 p+ J4 A, Y5 w( p- ^% a
+ A. _# }# O" K" O: Q* S; x
内循环试了4种方法,( G5 q. S! _1 m" A. d/ Z
1. 直接调用 vector inner_product 247s : b+ }9 @- G8 L# y; ]
2. vector 循环点乘累加 237s
7 @' y) p+ L1 U3. float * 循环点乘累加 204s
; x6 i- y" Y. H; x) ~4. 空循环 100000 次 202s
" h9 w4 R% N* i! p5 U I- M1 o' Y' g) `6 e+ n: M9 K
不做内循环 200s
5 U* c2 B1 I9 c9 y1 {8 m( W4 z& ^2 A" x' [4 k# M. @# P) O$ w
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
8 j8 x! t4 \8 O另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。, t( f0 h7 z! {) @( a
4 y4 \' {8 _. v7 _* Z至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
- b5 l0 t1 z( X# o, H r- b( x! }5 K3 S- Q1 L
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)- f. O7 C, A$ W# U3 R
& o# q7 Q9 J0 V: L" Q
std::vector < float > vec1(N);
8 d4 \- o K8 `2 C8 ?$ ^5 K! Q std::vector < float > vec2(N);
; p6 D1 k5 ?" P8 U- n float* b1 = new float[N];
" H' l( E5 U+ E$ v float* b2 = new float[N];5 o/ R! y7 o" s2 ]. G5 Q
# ]+ C* u( w9 N, `' t3 { for (int j = 0; j < 6000; j++)
0 e) `* h- _8 v$ O! \6 x- S {
5 Y" Z2 P$ H% d+ G) U' N std::generate(vec1.begin(), vec1.end(), []() {1 l* x) R3 U( g+ V
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
+ d. f) |* l% H7 f1 H });
! T5 H, @0 C E
) a% u7 E$ E1 X9 @ std::generate(vec2.begin(), vec2.end(), []() {1 Z: e! i$ Y a' h
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
9 @& ?" a) m# { });" d0 L8 A& N/ ~" J9 u; i Z
6 C! ~$ p) j( s7 h2 S. |) T" j& A& S for (size_t jj = 0; jj < vec1.size(); jj++) H$ H1 f9 }9 m; _& [
{- M6 H8 W/ O5 b8 F1 B" b1 y
b1[jj] = vec1[jj];
y3 w* ?+ ^/ ]+ a" V. @& ^ }
- z2 Y5 f8 ]+ }. v u' _& i$ M% j
. o9 k% R4 C- @2 ?( o for (size_t jj = 0; jj < vec2.size(); jj++)
/ M4 v: X8 F9 v$ H {
$ m* \) V' Y) y6 O7 C b2[jj] = vec2[jj];* q: R3 R, q0 s8 \+ Y
}/ H6 R& a; A" B$ U
) r7 Q- k" s: B" {, I5 X) k0 | //Method - 1 N=100000 247s 8 ?" V7 d) }+ _3 ~2 u# z
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
/ r5 M3 Y W) | t- y+ Q- y0 v: K
# @: X: M7 G! w' d //Method - 2 N=100000 237s
+ `, E+ V( |1 ^/ d- s; |1 | /*
; G+ u$ |" O7 A2 f7 O$ B3 C# v9 @ for (int jj = 0; jj < N ; jj++)
/ M2 s' ^$ t9 q* n/ o5 q {
4 T G( N4 @' V7 ` fresult += vec1[jj] * vec2[jj];# E; Q+ S2 y. E' L
}
$ B% y' v4 i* O) W1 X6 U0 ]! e */. ]. s3 J% p: d7 w8 v( W
$ h; [9 @/ B; B3 M# _; k //Method - 3 N=100000 204s4 W& s8 p4 @, A8 \ [: c N
/*$ P7 x; U# U* ]/ m/ o: y1 B
for (int jj = 0; jj < N; jj++)( T0 B4 Y0 J$ |2 a
{2 `$ l8 l1 [& S( x$ |4 G& ~ t7 W
fresult += b1[jj] * b2[jj];8 L- |3 I6 {, Z
}$ W6 u" N) M3 p- X' j! S; O
*/
) A& T& L. H) v; X; @; o, Q. g( S5 X p! G
//Method - 4 202s, [- A! _" x+ r% f# t
/*
& {- ^# f- g w/ m4 R9 J$ ^! G for (int jj = 0; jj < N; jj++)5 s8 T0 D+ x4 F ^: C' e4 N
{
$ }7 ^+ A! \3 f 2 L' e# f4 u7 C; {& k1 p
}6 Z9 B: D) s5 G) X
*/
0 H9 O4 N6 s" h* Z% _ //comment out all methods, N=100000 202s
) Y4 ~) k. g- l/ o }* f" h i: O% Q! C+ W+ N
) K* m4 ^- Y, @' T3 F! K7 B8 j7 E
delete []b1;/ v, _9 n6 \, w) N0 l5 B: G9 f
delete []b2;
) ~- h! r+ a, B1 m% n% u, R: q |
|