TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
: \, V# O% b3 ?- C& N2 h8 h; R5 d6 J& I1 T; x- ~# Z
理了理思路,重新做了一个测试。* V4 S' d5 a0 A |+ a
做了两个 vector 和 两个 float *, 都长 100000! ^! N: p1 q6 [1 \
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.2 R5 Z: C# [( v+ D2 J
- U6 R4 n- e" \( U
内循环试了4种方法,$ D# k* K7 u; p! K) N: V5 I
1. 直接调用 vector inner_product 247s
X$ f2 m3 i M+ x, \; K3 Z* b9 r2. vector 循环点乘累加 237s: n# `3 u; w K+ `- n' g/ i6 _, |
3. float * 循环点乘累加 204s
3 l0 q- n3 R: b2 Y$ I9 k2 y4. 空循环 100000 次 202s
4 L8 v: Z) {- |) I7 A0 \
X. V9 ]9 a0 {( z3 c8 g. d不做内循环 200s5 u" X4 ~' v" z0 d
9 a7 M- h8 v `你昨天说的对,内循环本身占比是很小的,大头在其他处理。% M: D, z! u* M D+ p9 u1 x0 j
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
" D, E K5 b) Q, d8 E( V4 o% W$ x+ h5 C
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
; U% P% Y" M0 O! a7 Y
! Q+ d& E" }( l) |) \(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
# p4 {1 Q! H% _( V3 w
/ @, c1 l& {2 Z( r7 i+ F std::vector < float > vec1(N);/ {1 ]3 H P" K$ \, ]# a2 b% l* |
std::vector < float > vec2(N);
# y7 T' [6 b# C2 z& c float* b1 = new float[N];' G, P/ ^8 P' a W/ u% H
float* b2 = new float[N];4 B$ X, ]5 r: P) N
5 S( h/ f% k0 d2 i2 z for (int j = 0; j < 6000; j++)
8 n7 ~7 T8 b- {8 o3 D+ I {
$ w7 h/ d: |+ n std::generate(vec1.begin(), vec1.end(), []() {! \7 W* x) l6 ?' h
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
) g6 }$ U* Q, w });: ` X+ o V& |. ^
( x# x3 B/ H, `+ ]) I
std::generate(vec2.begin(), vec2.end(), []() {
0 f0 w# n2 k% `9 _+ r return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;& U7 S' N4 S+ H9 {2 M4 L# J" }
});
: M+ h: \& G2 x: \5 Q2 O! b, e3 e
F$ c+ L! O! B$ ~( `, g- C5 [ for (size_t jj = 0; jj < vec1.size(); jj++)
- a) o4 c' h1 T( p, [0 y- b/ F {* H" l$ r) N9 N `2 S8 U& f$ R# O
b1[jj] = vec1[jj];
! k' s; ]1 u$ a; Z: Y }
, p1 q$ Y& M0 x0 O8 M
1 f/ F ^3 h0 P: d+ X2 L for (size_t jj = 0; jj < vec2.size(); jj++)' L% l$ m* V' Z/ p' {. r
{
& i! H) K7 j) S5 _& J, r/ n: S$ c' N b2[jj] = vec2[jj];8 L0 ]# c% y! U( _
}- e& {$ @8 A! u% q$ i& X& h1 a
1 B H# J' R9 ?; ]) f1 F: ~! \6 N //Method - 1 N=100000 247s
; C2 g* ~- l$ Z( X //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);0 m1 }( d/ F3 ]6 p M
4 d+ k2 |7 l& `( K; [) }- D- S
//Method - 2 N=100000 237s
% {# V6 w6 u% O7 P/ G7 K7 @ /*
8 C7 R% E6 k) M) E0 g for (int jj = 0; jj < N ; jj++)
/ T$ }$ D5 ` f6 q+ T {
) i5 _ W! r6 K7 l4 | fresult += vec1[jj] * vec2[jj];
& ?0 K m( ~$ b; E- S }# Y3 t1 a' ^ h3 W$ S y
*/
' X& {2 E8 k- M5 f 0 T* G+ Z/ Z. c5 Z. D" f$ K6 d& b
//Method - 3 N=100000 204s$ f* j' `# _: v: L2 S( p, Z4 f
/*
6 u8 j, s; s5 R for (int jj = 0; jj < N; jj++)2 u, T |; C9 D* F
{
) L$ e3 Y8 V" m# [, Z fresult += b1[jj] * b2[jj];
& I! p* V0 i3 e" U }1 n7 U, c F0 i4 g( [- B
*/+ ^. T6 A* [# t0 Q1 X6 r) m6 U
$ S8 a6 L0 I$ O. F0 i# q //Method - 4 202s' T4 D9 A8 h* \$ z. ^
/*
4 a3 v/ _4 L) g# P for (int jj = 0; jj < N; jj++)
6 U ?$ d# |/ H; U% w {% B) j/ c! m# g! ~$ g0 j
. u* s& ]3 l, [- t( _" l0 }
}
- |: Y- B2 q( a7 a7 z, v: m8 f */& {0 l' H" B" m7 D/ s6 _0 t
//comment out all methods, N=100000 202s
: n# r0 X X4 o$ u }
# r8 C3 V0 _* N0 m6 k! R0 c! V# f% y; n5 f- g1 t- H
delete []b1;* L) }. B, B/ h& |
delete []b2;
" `; O/ @" t1 e. s: ?5 I/ F |
|