TA的每日心情 | 怒 2025-9-22 22:19 |
---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
' m* q* C6 S2 h3 q3 b. @' N4 w J2 d- w+ T/ e* m
理了理思路,重新做了一个测试。
- n6 `+ l( G2 i! e( D做了两个 vector 和 两个 float *, 都长 100000
# f/ t5 ^; |, a2 B& F, V% l外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.) m* e) G* H1 t6 B
`( G: @1 e- V: z q内循环试了4种方法,
/ x3 V" u; y5 U1. 直接调用 vector inner_product 247s / ?/ U6 E8 i2 S* S5 \3 k
2. vector 循环点乘累加 237s
' O# u3 W9 H- M n, v8 W3. float * 循环点乘累加 204s
& T/ C3 w$ w, n8 u& q) P4. 空循环 100000 次 202s
* d- {2 G& Q$ x* d/ Q5 t
! V0 v7 C! n( i ?不做内循环 200s
$ j$ u9 W( C( ~3 G
5 A% e6 `, V4 @ Q2 c+ U, w0 T* g你昨天说的对,内循环本身占比是很小的,大头在其他处理。4 E, b, [$ z; J' N3 X0 p( |! E# X0 S
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
. z% d5 p8 O3 \4 W8 B! P$ c" a/ u* a- r0 M# M0 |/ H" ^
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试): Z: u i! _5 {& F
- U/ \" e* q J, S" C m: j/ s; c; G
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
; a2 W/ A) ^4 C5 n6 H
' e9 J0 L5 N1 O std::vector < float > vec1(N);
" K6 S% V, j( s5 `: p7 k$ x std::vector < float > vec2(N); J: z+ x2 s( F1 l' l
float* b1 = new float[N];
% R3 m# ^" O+ w% B8 ]" [% W float* b2 = new float[N];
Y2 O- \2 g/ N$ u9 |% H I
$ e/ E* b! \' K for (int j = 0; j < 6000; j++)
. E }* X' {1 M3 T# `+ P+ @1 S {/ v( l$ {1 X6 H' X. I# p9 {
std::generate(vec1.begin(), vec1.end(), []() {7 N7 H1 j- \8 M& c, }
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;* y, Z* k# u' F& q
});' u6 w+ R3 y! I1 V) E
$ m- S& [! h; p std::generate(vec2.begin(), vec2.end(), []() {
5 D. D3 S4 O& z( g return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
& Y; _% t7 J2 v- O L& L });) T+ j" R- \% k2 T2 P
P0 D: m& Q' D7 \1 ?, } for (size_t jj = 0; jj < vec1.size(); jj++)% q) U+ z' l4 V! s& I: @. j
{2 M$ V& y2 U- ?: u$ E' K: @
b1[jj] = vec1[jj];. I, u# B# c, P2 w( l1 `9 s
}5 _/ C# S- R: ~) D
9 s1 C0 h6 e5 w u for (size_t jj = 0; jj < vec2.size(); jj++)0 S0 w; M* M1 b) H" \. O
{4 i( U& R6 j& w( X$ S$ x
b2[jj] = vec2[jj];* k" _2 z* x3 ^( I
}
0 Z2 D& f# {- f6 v
, e. H* F/ E3 o9 G" C; l //Method - 1 N=100000 247s
$ g2 L2 N1 N% ^% `& P3 u% X //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
5 U2 i: w1 Y6 b' |" l" S! P/ O$ x
/ \9 O4 ^' X* \ //Method - 2 N=100000 237s' E! A- E7 F* Y
/*
6 C% [" H" x/ f6 o& H/ v* J for (int jj = 0; jj < N ; jj++)3 }4 b( }# w* S1 {! @0 |
{* @8 A8 ^4 d5 Y- \# u1 ?
fresult += vec1[jj] * vec2[jj];3 R: m/ n, d5 x1 P
}
% `1 F' D/ ^ L* b! l0 _" ^ */. W, z/ W0 z/ t2 v
7 X& j+ C9 G4 v2 K. n
//Method - 3 N=100000 204s2 m( f% Z: y: O- c4 S: I
/** e" B2 I7 l8 H% V$ |
for (int jj = 0; jj < N; jj++)
6 G$ {3 V* F$ b7 l ]$ Z {* |+ {& x1 N$ I- h7 w4 x* D0 B
fresult += b1[jj] * b2[jj];# d9 w7 {2 u: ]) S: C/ g6 G0 P
}
1 M% m! X0 a4 \4 {* D */
$ N* X& K- {/ i" N k" n* G# e+ M/ Y$ R! o6 S+ S8 w
//Method - 4 202s' y: L3 Q- P# C1 f7 n
/*
6 `3 f1 N: ` i/ Z, ` for (int jj = 0; jj < N; jj++)
+ c) M. L0 y8 j. D) L+ U3 | {
2 [( C" Q& x1 d, u1 x L, T
/ }1 W/ V7 |6 O: l }, w2 G# c- ?! {8 x1 X
*/; Q' R- B2 O" v4 S( J {+ q& m
//comment out all methods, N=100000 202s u5 Z3 C. A6 g2 I: {7 S$ ^3 V- o
}6 {8 n1 j1 b) s
7 N) d9 \/ L5 G/ S0 ]" c7 n1 _
delete []b1;. D; | @5 R/ J
delete []b2; , a7 w' k# W7 j4 b% k0 Z
|
|