TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
$ r3 c# p" O3 ?2 t: k) @ F" C+ ~; u
理了理思路,重新做了一个测试。6 b& g6 W, l9 p: `! A( y0 j
做了两个 vector 和 两个 float *, 都长 100000' h6 h2 m$ g1 x
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.: s/ ]; y7 i$ |+ R, p
8 U$ R6 X: o. B, p0 p内循环试了4种方法," l( u- c5 H/ j8 G- q" V, `/ Z% z
1. 直接调用 vector inner_product 247s
7 y& G- a6 r7 ]9 V @+ l2. vector 循环点乘累加 237s
, z- E+ g6 z! u( b3. float * 循环点乘累加 204s
0 N/ l2 j2 U! H; a# G4. 空循环 100000 次 202s! h: X: D( F" g' Z9 Q/ c- ]# H
7 z" c! @' v) ]* |+ [; P5 s4 |! t- @" ]
不做内循环 200s4 k5 }; G6 @+ J, F Z( [" S
8 G; P( T4 e5 K4 E0 S4 p; @
你昨天说的对,内循环本身占比是很小的,大头在其他处理。9 b6 k2 A/ v% D) }
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。 G d0 I2 V, A9 ^+ N! k% _- m6 Z
; P: P O' @. l2 s, v至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
% x3 N! C3 b) a, v: B U& ]) y
. m5 l7 N3 H! O. ~) `1 S7 j(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)" _6 k% P+ G8 R% F
- g$ y: `) q. r0 x6 C: K
std::vector < float > vec1(N);
4 N5 X" O+ q% L std::vector < float > vec2(N);' G) a% \" ]5 _+ F
float* b1 = new float[N];
; x M% \3 b3 J& k float* b2 = new float[N];
7 m Y/ U- ^# j, k6 d/ ]% ]: z0 ~) P8 t* b0 B
for (int j = 0; j < 6000; j++)
6 U2 j6 _* p8 S, S" R' g9 F4 o {. o, |$ `' J% b' W
std::generate(vec1.begin(), vec1.end(), []() {
) C9 V" F- [3 V. I5 ~+ B' M return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;, ~' t, R# C1 ?9 u
});2 x1 g: e+ \9 M
# `! N/ v& K1 o/ Z: ^% ? std::generate(vec2.begin(), vec2.end(), []() {& z* |% k& I8 N3 Z7 a
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
3 f0 R& G M- p d6 c6 X/ | });' O2 s3 X; d6 v; a! c' P6 R
( L" G( Z4 c" C+ E- x W% o4 @ for (size_t jj = 0; jj < vec1.size(); jj++)
, |2 U; c4 _ y; R) T& d {3 C. b6 M+ G- n% E7 }3 b
b1[jj] = vec1[jj];: y% n- m! }( D, n$ |, R$ G# x
}
) x$ |( t- M# g! W4 h$ v
3 u1 }2 }4 ]8 v for (size_t jj = 0; jj < vec2.size(); jj++)
! ^, L h$ L1 ^: b {- L6 b7 ]) \. A3 W* d; N% a: e
b2[jj] = vec2[jj];
. h* T' K/ s1 {' Z. D$ ~ }8 T9 L$ m1 |/ l5 P7 O
; [/ C- v% G; u; X( k
//Method - 1 N=100000 247s 0 o2 K" w4 T: ~) i
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);1 Y3 E$ a2 g' j6 A* x) u
' l8 C# `1 k, J4 S9 d1 r
//Method - 2 N=100000 237s
5 }8 C- G- b- r4 d /*& T: _4 v: n( o: J$ ^
for (int jj = 0; jj < N ; jj++)
9 d @6 g; R2 l; V4 q; o# ]4 [ {
$ m0 [) g$ h1 y. Z- \' f fresult += vec1[jj] * vec2[jj];8 _- v; @& ?4 a3 S1 _; u
}+ S- u3 k" U: F+ z+ q: g
*/
) S' q W% f2 m5 ] n M* J& t9 A7 c3 R X; D8 C
//Method - 3 N=100000 204s
1 G1 d7 b6 f0 Q: m2 \ /*6 @/ b' g3 k5 l. E n* u" b5 `
for (int jj = 0; jj < N; jj++)
, c" X) p3 c/ }* u' | J$ D' n {
* J0 c+ a0 t* f( t+ z1 w fresult += b1[jj] * b2[jj];+ d9 n* t6 W& f) s* V3 J
}/ _9 Q( d* s) x/ t% v- ^' R
*/- R- n" V3 k/ \! X
3 V$ O& E1 `5 m" D F3 s //Method - 4 202s
2 O9 s& L: g, z+ f P6 z, Q /*" e. B6 z# V* r8 S; A1 t& E
for (int jj = 0; jj < N; jj++). O+ Q( F( ]+ ]+ M5 \' t# J
{
# N% Q U b1 K& f" U: g Y% S
; t. j" t, w. m# E6 y }
5 [% n" M; n; p9 e0 ?; k J */
/ J+ `- G* T1 m //comment out all methods, N=100000 202s
+ g( E- i$ T ~ } A2 a, e. L2 D9 Y- B, ^' G
7 Y- Q4 H/ ?2 M! b$ o% O- }- g delete []b1;
! P+ t. v6 @/ e delete []b2; 4 v, m" r6 v7 R; ]
|
|