TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 ; r0 c3 `3 ^+ K) [
& a' N. U- l3 V f0 Q% o' ]
理了理思路,重新做了一个测试。
4 Y1 a, L" W/ [4 m* C3 }& x% a, ~做了两个 vector 和 两个 float *, 都长 1000000 a+ ]0 ]* t0 W6 |) `2 g) V7 ~
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
. g' m, S+ H' o. v* J
v2 H: P K! T! w# y( |. u内循环试了4种方法,6 J6 S! C# Y G$ J
1. 直接调用 vector inner_product 247s
9 T" Z5 K6 I/ ~, k+ [2. vector 循环点乘累加 237s; n, H* j2 i3 T
3. float * 循环点乘累加 204s
4 H4 g z; u2 `: {4. 空循环 100000 次 202s
' M9 d& o8 S9 H% u$ U
K9 ]% y: V3 m8 E不做内循环 200s) x8 `2 s* y: V/ I, p0 d% m- w" c
4 Z1 q- H# a" I& p3 ~1 V I, F7 r你昨天说的对,内循环本身占比是很小的,大头在其他处理。# [6 ]- J. B" A; w; f
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。& R0 R3 H) a& V# W. W# x
9 q; P; M. y( v7 K, G1 C至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)4 s" [1 i4 `6 u% _6 `: s
5 k2 m3 x4 {3 L1 }- }; x(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
* I# v- W# V3 U4 `7 R/ k" V. o$ v+ @
std::vector < float > vec1(N);) ^% q K7 p/ O: ~0 l0 q/ W
std::vector < float > vec2(N);# v9 x K# H% F* A; p2 r6 q
float* b1 = new float[N];6 q( ]9 \, A; D6 g4 m; I" G+ a
float* b2 = new float[N];8 u9 D/ [; _" u C9 q
/ W7 m7 q+ o. ~8 J: ]5 m/ b$ x8 N for (int j = 0; j < 6000; j++)1 f I8 C- w5 j: v
{
' s0 ?7 u2 ~, R* M/ K/ M; E% u std::generate(vec1.begin(), vec1.end(), []() {
4 ^) B+ O+ C/ N8 a4 P return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;/ B5 o q! L9 [+ Q1 H' i
});- Z9 }6 B2 e$ `4 W" l- g
* s# m. D4 |8 Y* u& p( B# u% B std::generate(vec2.begin(), vec2.end(), []() {
. A' `5 q8 ]4 D1 x. B5 B& J return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;# }5 w. @) F6 `0 a( I/ q' c& H
});' [2 Y& ~$ X& A/ c7 d$ J# u
; h) V: b8 e4 O9 i( q" ]1 N3 @
for (size_t jj = 0; jj < vec1.size(); jj++)
6 H5 m5 i, o% q {; ?2 v) s4 D' T
b1[jj] = vec1[jj];# P9 [3 c5 G% x. s
}
/ p( @ s# M7 t4 z" Q
% d0 `/ I6 F" y. K+ U! I for (size_t jj = 0; jj < vec2.size(); jj++)4 T( v$ l' ^! h& T Q3 E# w) T9 M
{' O) D3 j0 m( a
b2[jj] = vec2[jj];+ Q4 E/ R! u5 g
}
, _0 G" x% q& f$ T- R* T+ q( ?! {9 i# B7 D
//Method - 1 N=100000 247s ) R7 ~* ^! t( m/ Y/ [* i! a
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
+ B) ^# ?) A1 V0 m" C
0 a1 B1 `' |5 I1 k //Method - 2 N=100000 237s5 U2 e, G* ~# f; m$ F8 P
/*
1 n# n4 G/ M5 W# O. ]' x' ]% \$ |# p for (int jj = 0; jj < N ; jj++)" m O2 ?6 d( c
{# a; e0 |! B; l7 n
fresult += vec1[jj] * vec2[jj];
9 @$ p* ?4 ^" ^" j }
7 M+ K# [; f3 `9 V+ v9 { */
6 O4 W h; P9 ^' z# V( h
, A7 D6 x, V- a, M9 ?. U; a' ~ //Method - 3 N=100000 204s( h. s( U1 T: t* a* I
/*- b- L2 x3 g( X4 S( r& L3 F3 X$ `$ R+ J, G
for (int jj = 0; jj < N; jj++)! L- [: R1 `9 m* Q6 m
{ B6 u5 C$ _' o8 T- s
fresult += b1[jj] * b2[jj];+ x# Z5 M: ^6 W1 F( V% g
}5 d- B" M# b9 c7 H
*/1 o% B# R# ?$ w! q! q
9 P8 Z7 Z, I& ]* M
//Method - 4 202s% m, q! ~' O1 d# R
/*5 u1 p p6 Q: h: z0 x2 O/ n
for (int jj = 0; jj < N; jj++)
& r- X5 f: h: h v: o {) i8 v9 ~5 c7 b# y$ n
2 A3 J& ] n6 y! O/ P& V
}
3 {( x8 w" A1 N, R */- G/ B, H) Y& @/ O# g K
//comment out all methods, N=100000 202s
. R9 d, Z/ e0 u! p) D }: m. Y9 U) e3 O
$ \& V/ B- d1 |; S% d
delete []b1;
( ?9 ^ \* f( \ delete []b2; Y' O+ g% U; D# A% A: D7 D" y
|
|