TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 4 p( W, p' }* E& `, A: O
2 A7 `8 B; \8 s( m
理了理思路,重新做了一个测试。
1 y) Z+ b+ I( E' c7 o, I做了两个 vector 和 两个 float *, 都长 100000) v0 t( G! k" w( O: x" H
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.9 }- o' W5 s5 G8 X( u. t3 Y6 f
4 j7 w( \4 j) j9 f内循环试了4种方法,
0 s2 o/ x0 t' X' ^8 W" O1. 直接调用 vector inner_product 247s
- R( i6 w0 t0 M+ U2. vector 循环点乘累加 237s
! e( r9 x" H/ _; H7 q) h3. float * 循环点乘累加 204s" O' z6 B6 [/ {# a! e0 R/ C, D
4. 空循环 100000 次 202s) X) f- K3 Z2 s- M1 I' G# l" C N/ i
6 `2 E$ u( T3 x/ |. f7 F0 p不做内循环 200s
; B2 P, d! v. C6 Z9 N# T) _% F* v. s7 ]% e
你昨天说的对,内循环本身占比是很小的,大头在其他处理。& _/ j& |' G% K, A- _
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
1 u# x8 _' g1 e0 g F' M- t4 o& `9 ?3 Y4 O& Q7 c
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试); U7 i" E2 C. |: s4 T2 j% Z- C' q
7 x+ Q+ q5 x. U. s, q8 y
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
V& F% S' G5 W. H" T& z! }; F) N" z
std::vector < float > vec1(N);+ ~% ?1 A! ]( u
std::vector < float > vec2(N);! \' t- ]# x X1 S3 I
float* b1 = new float[N];$ d# g% z5 q; g' P$ f3 K5 k0 x/ T
float* b2 = new float[N];
9 m6 }% K% F" ^7 C/ }2 t N; t
) H; C8 f) X- ?& `2 A4 g; X, U for (int j = 0; j < 6000; j++)# q! y7 o5 ~4 e9 p$ i# P1 P- d0 x7 F
{+ Z. Y& C- r$ N/ w# T% k w) f) `
std::generate(vec1.begin(), vec1.end(), []() { N9 ^. o* a* Q( L! b- L
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;# w# p2 ?" N) ^& Y
});) U# n( z5 R! Y& k& P
i1 W7 I9 p& _) L9 a4 U std::generate(vec2.begin(), vec2.end(), []() {
! N s }7 C4 C5 }( L0 g. F0 W% @ return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;8 E* u: ]& B' v( a, N) ?! v \$ B2 s# c
});
2 x" }2 E% X1 d
; j) J) Z( C! A0 } R9 z for (size_t jj = 0; jj < vec1.size(); jj++)5 Z$ j: V, m) T& o4 |' \ Z% F* S! }
{
. L; @7 g- R% S+ F8 x8 n' { b1[jj] = vec1[jj];" h J6 _( l3 g9 B: L
}! l4 p) [7 t8 |' U: N) e3 Y
" Y% M5 F: t* v) E+ |
for (size_t jj = 0; jj < vec2.size(); jj++)
: s. l9 I Y8 M4 V v {
2 W2 |+ a, n6 x% F t0 p, [ b2[jj] = vec2[jj];& E+ B; T6 P n0 W6 X
}# H0 q. [" i5 V: q! s
+ g0 l6 S8 W' C$ G5 q //Method - 1 N=100000 247s
7 T; |3 ?- f; l) q //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
: B' m; i4 ?( R8 W6 _ 4 w, O: t) u1 [5 B: |
//Method - 2 N=100000 237s7 D5 U0 @% p/ M% G m# P6 H/ ^
/* t, [5 S5 h! f# F; F7 c3 r
for (int jj = 0; jj < N ; jj++)
. r- }: ^1 m( { {' R4 G9 U5 e* ^9 P+ y" e- p; |
fresult += vec1[jj] * vec2[jj];
4 q9 s* f, ~) Q+ r% D. b }
0 G+ n6 y. y. M. N# _6 y */* s0 k% f6 B: O5 ? R
, x" P2 J7 l+ B; S //Method - 3 N=100000 204s9 r, G/ H0 C7 Y$ e& l# S1 d! a$ W
/*% r3 v |) e# V& c) C+ G( Z
for (int jj = 0; jj < N; jj++), h9 L7 k" N+ D
{; j z3 u) |+ A T0 v3 n. ~
fresult += b1[jj] * b2[jj];" }: `+ r; |8 @, r i
}" ?8 |, k( w: k0 H8 u7 a2 a
*/6 t( d& W, x/ i! Y
' c" N" @9 p7 `! z7 \9 Y# t! ^ //Method - 4 202s) L# z% Z: l- x. U! b# @/ t
/*
. D& i* M6 V1 x! D3 r6 B& D: c for (int jj = 0; jj < N; jj++)
, T8 F- D& a/ w {. r2 f3 u. r; S* g4 y1 e& G9 y5 G
# A' M- v7 s/ m4 s( \
}
5 |9 z0 e6 I. i- V */8 N, s7 g! G% [& S% C8 S' e6 m
//comment out all methods, N=100000 202s
& l; _ S; H6 V! B3 x) V5 B3 H }
# R9 e `0 `) W: H# A6 H$ Z- w- B9 F% l, ?: C6 g1 m; U
delete []b1;2 o6 {% b- s' v7 \$ F# a
delete []b2; 6 W) `' j+ G3 B
|
|