TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 & d( U( u0 I% Q# m3 E, y
9 @: _+ D7 }3 I9 u1 L7 W9 v, U
理了理思路,重新做了一个测试。
8 w% M( D2 B0 J; G+ ? g( |1 q做了两个 vector 和 两个 float *, 都长 100000
' T: v: J5 m( ?$ k }6 r( U# I外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
" v: f K( w- I0 d6 V; `
) ?7 c' ]2 J7 B3 l. ~2 `内循环试了4种方法,
6 I: ~* E% E" i) n; T1. 直接调用 vector inner_product 247s + k2 T+ |7 V4 k/ h' n6 i
2. vector 循环点乘累加 237s
/ H- E# l- R( L* R; R3. float * 循环点乘累加 204s
* X% ^/ f" r; L' ~4. 空循环 100000 次 202s
) k+ v2 p3 D; S& G( X7 k- j! v9 b3 s5 Q7 T+ q7 z) U) c
不做内循环 200s
5 ~5 [# V6 Q* z" _
6 R. }: E5 d: y0 U l; J- J& W @8 s/ f你昨天说的对,内循环本身占比是很小的,大头在其他处理。
2 I9 ~' Q/ D2 s另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
5 C; \8 t8 c- A' |6 {; Z0 T+ Q/ L7 e7 y7 C$ U! Q2 g( `
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
) m: [) \) `# A+ {; A
- x* d$ s0 P9 p4 u. h- T2 K(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
: m( K2 S5 b0 w# D; i4 ^: p4 l+ v1 T: q4 u9 N4 h
std::vector < float > vec1(N);7 H/ s. l- p. i4 F
std::vector < float > vec2(N);
6 A* O h7 y* x' e3 p float* b1 = new float[N];8 a% O' l4 d' t: e [
float* b2 = new float[N];
, i' c7 b4 H9 E1 i. K% V2 R; F% f' A! U6 N
for (int j = 0; j < 6000; j++)
4 j s! z+ W9 j* W! @- w {$ S. }) H3 m! ]( H8 P
std::generate(vec1.begin(), vec1.end(), []() {
0 s: F% ?; E& A$ [$ `1 j$ M return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
% h9 D) z& ^& E& Y });
8 L, P2 o: h% Q3 |- E+ D: `- L7 Q, g% Z& d3 w l, o
std::generate(vec2.begin(), vec2.end(), []() {5 @* y5 z n- e! H; L; |
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;5 m" T; }( l6 U1 u3 p; O6 R, l
});
3 m1 h( q! V6 P! @/ u
) |8 R5 h, J( j6 H' y" R9 ?. f for (size_t jj = 0; jj < vec1.size(); jj++)
O6 _, N; T+ q f; ?" i5 Y: L {
5 H# F$ n- ] q2 j3 T9 B& {( ^ b1[jj] = vec1[jj];
9 F* R2 T9 m3 b6 J, ]5 F }1 v$ P) c' V8 _5 A/ `4 k- Y
# E5 ?) k5 r9 |, @' o0 Y3 f
for (size_t jj = 0; jj < vec2.size(); jj++)1 {( C8 v4 ?0 m1 m' R# |6 i7 r
{
3 H- z- P6 K# ~/ n- F. [0 \. _0 I b2[jj] = vec2[jj];
, U& U3 w. m# C/ g }
# {- U) E9 s' y2 \, a2 P0 R
7 O2 m* E: h0 n //Method - 1 N=100000 247s 1 Q" N2 S# N& S& ]0 l7 P) Z% r
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
3 W: E2 Q; x4 b' ~
" s# b/ L4 ?: D `( {* S$ _ //Method - 2 N=100000 237s
1 l& h& ^+ L7 X6 U1 l5 p /*
' r0 y& R# N5 |& P; ?$ F0 u for (int jj = 0; jj < N ; jj++)1 O- }4 c8 o& R: M( K3 {
{. ~0 n1 R, Y; q
fresult += vec1[jj] * vec2[jj];( A; A& @- O8 P& Q! w) s
}
" w0 J& a7 M7 R$ A) k */
6 Z* a' U& y4 @. u
' n, z) D) Q4 g4 n2 }" g8 K/ H //Method - 3 N=100000 204s# q" W( `8 |! L( S/ R- s' V
/*% Y8 t, r( u% |
for (int jj = 0; jj < N; jj++)
$ F2 h' f( a: J0 r {. r3 G0 W5 n* R" _
fresult += b1[jj] * b2[jj];/ U* R. {# Z4 |( Z, U
}/ L/ m4 T9 r1 {5 S" g7 V
*/
2 k7 u2 m# t. @% e( Q% l5 A0 G, X! _/ ~7 I# D; R9 v9 X4 t
//Method - 4 202s
4 \1 l# u! Y( `6 Y5 h3 U /*
0 w: N* K( ]5 r5 k" o for (int jj = 0; jj < N; jj++)
6 L7 ~4 u- _3 [) N* i. q* Z3 ] {/ t1 f" ]4 A7 Q v: n# I7 B$ K& B$ Q
9 r; A" B' Q+ U+ q# [
}1 q2 N! V% g/ g" }
*/% G' l0 ^# P: d7 }+ ?- K4 n) y- ~) j
//comment out all methods, N=100000 202s 7 d; ~$ ?9 X* P0 k D
}
: E) a& h& t' c4 i) ]5 i3 \. p0 c @* _- H% y: \+ v" l( y
delete []b1;
$ x e( Z. C7 ?" x. x delete []b2;
; e4 Y1 ^/ k9 c$ Y" c |
|