TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 . Z9 L3 Q7 @& m: y6 @( C
2 J: P. `1 O7 ]4 m8 a7 Z+ o6 O( e理了理思路,重新做了一个测试。
7 T- r7 w% E- E7 P做了两个 vector 和 两个 float *, 都长 100000
1 p) P# Y; z1 A2 U z外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
6 B& f: c- q ?% ^9 V5 U" L/ u- P; ]- Q
内循环试了4种方法,
6 B2 f8 l. E4 g/ W. n1. 直接调用 vector inner_product 247s
; M, X& o9 \/ a4 T2. vector 循环点乘累加 237s
4 N% |7 u( h8 V. g6 h7 r3. float * 循环点乘累加 204s. V( X9 E& r4 D6 ]8 T$ |
4. 空循环 100000 次 202s
! }) @0 |+ o/ o& @
* B- ?2 V0 d c- A7 I- I1 l, u0 J不做内循环 200s! H4 V1 s( L/ A/ V
; M# V1 w( R0 j; R- Q你昨天说的对,内循环本身占比是很小的,大头在其他处理。
9 B3 ~( i- j, i n# A另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
2 B: C( W. Z0 z* t# n2 ^4 }4 J7 R; {4 d3 B# _
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)6 A: o0 \# o" [+ {1 X- x
, {- B/ J' V- C8 ~(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)5 J* Z+ l3 S1 |% W
. e# y. U, H/ E std::vector < float > vec1(N);% Q8 ] C/ Z1 A6 o' _8 z
std::vector < float > vec2(N);
' a4 z: V) M$ Y: O float* b1 = new float[N];
5 r) u, @ Q! R8 y( S% a float* b2 = new float[N];$ r& s7 x/ f9 r" F+ J8 q
3 |& M3 v2 T1 O! Q for (int j = 0; j < 6000; j++)
- U3 \1 n+ K, f5 \# J4 x% p {. Q$ r" q/ c$ ?* A
std::generate(vec1.begin(), vec1.end(), []() {
0 ]+ O. @" B3 C2 s) A return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
/ c3 v1 I0 g, Y4 q. r });; ~* _- c! F1 ]% O2 Q$ j, s
: n2 w; m' ^& p$ `5 G, U' q std::generate(vec2.begin(), vec2.end(), []() {
: [* q/ E4 ^: f- V return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
3 l9 Y( J: R+ r2 \" f });( |6 B5 |6 x) a! X z1 k. e* q
/ h7 S2 D8 a) g- g3 S
for (size_t jj = 0; jj < vec1.size(); jj++)
; p" m" u' a1 B7 n7 ~# N. [: x& ? {5 R5 ]/ m2 i! V2 u' ^% m/ }
b1[jj] = vec1[jj];. T! T+ U( }+ Y b; ?, Z) q
}* `5 l% P7 l' h# B) \
$ n0 R( [. m3 t- c for (size_t jj = 0; jj < vec2.size(); jj++)! p: R5 j* D0 m6 A7 b) m# s
{
{( s0 m0 l& d' R9 V% t, U& S0 i b2[jj] = vec2[jj];9 l2 T$ Q( `# g5 X% v2 W9 L' d
} \. J9 r. D) j# W9 S( G
( q! ]' g5 e! c) E/ r8 c //Method - 1 N=100000 247s
: j6 P" q* b% A* e! V7 a //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);. K' v( F6 h5 p/ }
3 C/ o, E% d; Z' a
//Method - 2 N=100000 237s. n) \1 ~1 } e4 j- d( _6 d7 d; T
/*
) ~$ n8 D* f# m; B for (int jj = 0; jj < N ; jj++)
# D& U, T5 A; j7 k9 O/ O# o; t {' s% p$ z: c5 f3 K
fresult += vec1[jj] * vec2[jj];2 Q) b+ Z3 \9 [" C% [& U
}/ l' f- x# e2 Z
*/1 p$ W0 M' x1 H7 _8 D& w5 O* V9 Z
( R$ Y* ?0 B7 [8 y: _9 m% e; n4 x //Method - 3 N=100000 204s
9 E* m/ a: i, t( [) r /*# H C& v Q9 _0 a( Z1 R
for (int jj = 0; jj < N; jj++); ]) R3 t8 q* P t$ K* P9 J+ U
{6 l+ b& g, o" m. R
fresult += b1[jj] * b2[jj];
6 e* @; A! z# z4 J }4 ^ }
" K* f- Q: y; A8 l L, v0 U */! M3 O5 b3 B# T/ W0 y8 D% U% U9 M3 G
9 Q5 u# ^- w3 c6 M2 \9 O6 V
//Method - 4 202s6 x* c9 P1 ^; O$ q8 R9 Q% d: j
/*/ m5 c% W6 `/ C! {2 z5 Q9 G. t
for (int jj = 0; jj < N; jj++)
8 }" ?& x9 O" f. Q( Q* _ {/ j( I; w) E/ A
5 t4 R" v0 z- B4 g& }
}
; I, R) q; p0 k9 C# y$ O' n *// p" J) }4 k$ D* Z' Y
//comment out all methods, N=100000 202s
# _6 S( g' ]3 Y4 N) i' y: l }# I: l+ @$ f. R% O5 y
" z+ b5 `1 V* j* g$ r delete []b1;
1 a9 x# t0 q5 N2 h( Q. h5 n delete []b2;
; D3 Z+ p: i( j5 I |
|