TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
% r- y' `: f5 j: r! I3 B7 }& H9 h+ q; l. @: O3 T* b5 e- s( L, \
理了理思路,重新做了一个测试。! a) h% {8 F9 d- O6 H3 M
做了两个 vector 和 两个 float *, 都长 1000009 ^/ T* m9 y2 x5 U
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
7 m$ ?2 y( {+ e2 N0 w# W' P2 f
& G( Q& z) X7 y* C内循环试了4种方法,
+ L) j: E0 H2 l. G) n1. 直接调用 vector inner_product 247s ; h# R, J0 j, X0 T" p1 W9 w
2. vector 循环点乘累加 237s9 d3 _/ u. a" _
3. float * 循环点乘累加 204s) L2 S3 Y5 S; }2 K5 I) P
4. 空循环 100000 次 202s
. [; p2 _$ z( \0 I1 I+ T
7 q2 d/ b" U) c% |" P5 W8 ]不做内循环 200s
/ t: O: a3 L4 j) k( V( F9 b" A! Q" F0 y/ q! i2 _
你昨天说的对,内循环本身占比是很小的,大头在其他处理。! @" M6 ?6 x+ b+ @6 g* k1 d% O, P
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
( t; J y. P: `$ T# G7 D4 a6 |' ?8 s6 Q) \6 Q
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
$ M ?: c# `) K+ V+ c4 F; J+ e9 d' ~: `! t2 O1 `
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)" _. X, @& Z' h( M% X* O" q
9 ~9 \6 l/ A0 D; `# H. H std::vector < float > vec1(N);& k4 t3 T+ ~1 a# b& r6 `5 G
std::vector < float > vec2(N);
3 v. Q4 [9 o$ ?) M; M float* b1 = new float[N];
& Q4 w9 }) F: U8 @9 y- _: Q2 I0 \ float* b2 = new float[N];0 e6 Y6 i4 p6 x: Q% m9 n( Z
4 _* H& I4 d" c) V' K% Q: K" m2 j for (int j = 0; j < 6000; j++)
7 a6 v/ f; m! G% g- q x {2 s4 @0 K7 R) \- ~/ [5 u
std::generate(vec1.begin(), vec1.end(), []() {
3 a, c* ?2 S) `1 w/ K: V return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;5 n( N6 l0 X7 E
});
! \! z! e H" U2 V* P: `
3 o" p2 p: X2 k3 Q5 a4 o) p std::generate(vec2.begin(), vec2.end(), []() {: P8 @% ]8 M6 _8 d3 a- T6 U
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;4 r8 a! I, @ p. j
});% r* P; d, O- E, S0 E
& ?% Y6 \. m8 P8 q' j& W8 Y for (size_t jj = 0; jj < vec1.size(); jj++)% j1 A% x$ O' f- A
{; `& e' [% U7 t. V4 b( A9 |
b1[jj] = vec1[jj];
# Z, Q' l6 r6 F% `! K! Y; ? }
6 i! e- ^* U$ k- Z9 l% f! x
- H2 c: L& X/ u" ]1 V for (size_t jj = 0; jj < vec2.size(); jj++)
, t' l7 z6 ~3 v' X) B: i {
" s$ s2 s0 M- d N. l6 \3 m b2[jj] = vec2[jj];8 k& D6 G: V& v) |" v
}! w! Z7 G& r7 w0 ~7 D2 F# x
/ m' C+ i# K' ], ` //Method - 1 N=100000 247s
1 G/ M H: j( `5 U% y //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
" A. k, z2 [3 v& C
! s8 B) j Y& O% A/ l //Method - 2 N=100000 237s
2 a# H( ` I& k! W /*
' e N2 i2 `' `- i for (int jj = 0; jj < N ; jj++)
& S: l8 H% w! C4 B9 u) v3 v {1 g- D/ M0 f% A+ M0 @5 X" r% k8 R2 x
fresult += vec1[jj] * vec2[jj];
. w$ z3 G8 x |. n) }9 }$ k }
# e5 t# ` m2 L- R# u5 o; `+ o */! D5 M0 W# Q, l X
! b# a0 |5 a: E! O
//Method - 3 N=100000 204s
/ v! ^( C! X6 e; A /*
' ^9 v$ m$ K5 k$ p& _1 ?" A& f for (int jj = 0; jj < N; jj++): m) C6 O, U0 P6 c; M$ B! i( y
{
& C; E% n- l+ r fresult += b1[jj] * b2[jj];
6 o# E; Z9 x- j }
& o9 x! F% p T M! J! `) {- a% K */3 \8 \7 v9 p8 C9 I( q
9 ?% m, E& @' e1 g; v( Y+ E
//Method - 4 202s
/ \' b0 s! t2 {% M0 O6 M /*
. X6 c) }5 u( \( Y6 A6 ?9 E for (int jj = 0; jj < N; jj++)
5 W0 V, {4 B6 W2 g9 O- K0 H9 f1 K! B {' M" }8 I% B* E3 l/ M
# x" C! `6 B$ ]& I V }
3 W6 |2 F# a; U) R$ y8 S */
q2 j+ N: t( j9 l* G/ } //comment out all methods, N=100000 202s
- W0 Y: ~- y" U }
9 s3 k. `" e6 g& ^$ I! C' a/ e2 f8 D( l4 e% q+ V
delete []b1;0 q% e) T- ^. k) N
delete []b2; - |) c2 v' C8 h' B5 v4 H
|
|