TA的每日心情 | 奋斗 5 天前 |
|---|
签到天数: 1184 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 / Q; ]% C$ L; k4 g1 X
! }/ v. o- \* T4 V3 J; q) r, {理了理思路,重新做了一个测试。
# _/ Y. K' {3 g0 }3 W做了两个 vector 和 两个 float *, 都长 100000/ a0 K/ a' {( f+ Y8 R: j
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
0 E7 B+ ~+ g4 q( x# J7 M. h; h/ Q. d% t% S4 d. D
内循环试了4种方法,
/ T6 w5 G: U" P9 d* o/ h. b1. 直接调用 vector inner_product 247s 2 s+ R3 a# k& w5 n! w
2. vector 循环点乘累加 237s
6 h+ w: Y- G$ {- y# e' v+ y4 T3. float * 循环点乘累加 204s
! K( J+ `% X8 P2 W4. 空循环 100000 次 202s
& |! l: F |4 h; F. W- T6 _; {0 ~! M3 j
9 A4 R( D: }& d$ O6 i不做内循环 200s# U! k8 `/ w0 T
0 t P/ [* j7 m6 c M" {你昨天说的对,内循环本身占比是很小的,大头在其他处理。7 j4 X8 c* @9 U8 m3 e, M) P! v. k0 q+ V
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。6 t/ k1 T+ v! W) k- U" o
- C* @3 c0 i1 `8 C6 \/ ]* Q8 q
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)) M) a& U& Q; e) B
& M: b7 j$ p* G6 k# q$ C- l(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)9 }: D0 Z0 f: J1 |6 S3 m
* o; {+ r: w( f6 _" Q7 l# {* `% o std::vector < float > vec1(N);" L% o! @* [5 }4 B( o
std::vector < float > vec2(N);. z6 F+ @/ A; m4 l' u3 J
float* b1 = new float[N];1 \8 j! W, D' d
float* b2 = new float[N];
$ L$ K& o2 j+ \7 v) a
% F5 H- h# Q' F+ R1 h for (int j = 0; j < 6000; j++)
' o; T# F6 G) U3 M {3 Y: _& a/ E' \0 b: C
std::generate(vec1.begin(), vec1.end(), []() {
# P9 u/ t ?6 H/ p5 b return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
6 }' [1 ~) _, s9 `2 G6 \# s });0 h! N+ b2 F9 V, o9 I
9 f( z. j# u& O
std::generate(vec2.begin(), vec2.end(), []() {
# P' d a. [3 L& Z9 `8 Z return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));; s- s" e' h. m
});" c+ o% i1 ^+ ]6 [1 d% ?1 n
! X0 n5 [8 ?4 |; K* e
for (size_t jj = 0; jj < vec1.size(); jj++): o E: U/ S2 R3 r6 E7 E
{
$ e2 ^# l4 o' v& w I: P b1[jj] = vec1[jj];
/ _3 g7 M$ V& m J' t& O6 d, i& B }' P6 [/ r3 C# F; {) ~: k2 P
5 X3 d9 I5 S6 K% Z5 f
for (size_t jj = 0; jj < vec2.size(); jj++)
% B3 ]: K* j/ B5 s& O& a, Z/ U {
; A1 i1 T: i3 O0 H8 |( \8 o6 ~: E$ o b2[jj] = vec2[jj];
* R; G. a1 Z! F6 [# g. o }. D/ b/ v& H+ ^8 A) W* ~
' B) m0 V. A: b. D+ e //Method - 1 N=100000 247s
4 q8 H0 U. R* c) ?& `% r! I4 o8 B //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
: q5 K! e* S* S' Q) Q9 U
+ d/ q$ L2 c0 V" X+ ] //Method - 2 N=100000 237s. G4 e! Q3 p o+ Y8 w
/*
) J# |3 f' R+ l2 [+ n6 }% H# X! ] for (int jj = 0; jj < N ; jj++)
7 W: [% C u, n! B. A {& A/ ^* d! j. T
fresult += vec1[jj] * vec2[jj];4 P3 U& L0 ]. P
}% Y" V1 E& R! I. S4 L9 v3 [ B
*/- d- `$ q( [- e
% l, c6 q3 M6 m4 \
//Method - 3 N=100000 204s9 w" P4 B# k7 e
/*3 J2 l' `; q4 W" O" y) w6 s
for (int jj = 0; jj < N; jj++)8 |/ \* A5 {- S' b
{
! a! }1 m4 K) s9 M fresult += b1[jj] * b2[jj];
* c) ]+ E# J# s* r9 b }
+ {5 ]. l5 C R+ G% m3 K1 @ */. c. |6 _9 y( _# l+ R6 k
: m7 r! y( u9 ?1 F. B* I0 _ //Method - 4 202s
) x' f E; R# s /*
- {: v& Q1 l) h% s( M for (int jj = 0; jj < N; jj++)
# X9 ]( w D+ o, l- F2 E. Z7 q" F% {: | {: I9 K: j* {, ^1 n4 V; v# d; v
) c* u8 p; x }3 D. b }: [7 D1 ^/ }" a! N9 c" F8 Y4 [% S1 H
*/! {% e' x$ J+ m- k1 Y1 T
//comment out all methods, N=100000 202s
: G4 ^% H+ s9 p }
7 s# O/ @ T! V5 i
4 r( O5 D0 j) j delete []b1;/ e4 G/ ?% E6 ^" N: ]
delete []b2; ' b* v4 u5 f3 ~/ b4 W) N
|
|