TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 5 _9 u( [. i' R8 w: i+ m/ b
/ ~% r; A) B" u理了理思路,重新做了一个测试。
7 r( @' K; N/ \/ m做了两个 vector 和 两个 float *, 都长 100000
( X. T! }9 u7 x7 V* G3 f; j外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache. L' A+ I3 S n( m2 Y
; f# B5 ^! c( [; f
内循环试了4种方法,
7 l [+ M# J& k3 G: [# H# H1. 直接调用 vector inner_product 247s
/ g' r B" B6 [1 @- g2. vector 循环点乘累加 237s
, V& V' f1 Q& @" ^6 z1 ~3. float * 循环点乘累加 204s& X) X: c3 ^3 m8 g: R
4. 空循环 100000 次 202s& Q8 U: D( d' \' B$ g* Q
% s$ g+ W% e% A w! p
不做内循环 200s1 Z: u3 s; D% G8 `4 y
: N3 Y* [4 W0 A2 C! P你昨天说的对,内循环本身占比是很小的,大头在其他处理。
8 G3 K/ U8 `) u1 ^; k9 b另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。( k5 N, R; k7 N: ~; d
0 Y0 {! R/ p/ I# E# m
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)' o% o) x& G( A) s' t3 k' V- i ?
i* C5 j0 L/ k# q: S6 ~# B(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
% t7 D3 ]. b3 P" ]5 S& `& _5 Z2 l9 S
std::vector < float > vec1(N);" q; B5 S, k$ _6 k6 Q
std::vector < float > vec2(N);$ p& f) _# v. w. k( i" H
float* b1 = new float[N];* G; N+ W) X* w+ G
float* b2 = new float[N];
# D( p+ z$ k! ]+ g! o1 F
3 v/ Z( t! V. p/ Q5 x8 l for (int j = 0; j < 6000; j++)# K1 ]. |" ~" P( l% M
{
- P I& l+ W/ |; L- R! j std::generate(vec1.begin(), vec1.end(), []() {* k- C, a- L+ X+ I' f. j% q
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;2 ~2 ?6 R9 N6 Z C0 \) O" N, I
});
4 S8 f; d6 w% n0 s5 [- b+ i: S5 ]1 W1 B7 A3 i1 ^ Z7 L
std::generate(vec2.begin(), vec2.end(), []() {" Q$ _% C+ o8 r8 D8 q
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
, o3 N! r; @& Z; W });0 h7 u, o5 \# u: q: G( Y/ E
2 z( ^0 o6 b: R! U( x$ P for (size_t jj = 0; jj < vec1.size(); jj++)
! T0 t; S* a; n* w! V2 \ {7 L& f- l2 H, {- N0 ?
b1[jj] = vec1[jj];% n: h: w' H+ E" P8 @/ _2 I
}
" ~+ V; i5 ]. i7 t0 M1 z$ ^! a7 A* u" `% x
for (size_t jj = 0; jj < vec2.size(); jj++)
' f$ g3 [8 X# A* M6 H4 i$ V/ R {% H9 j% [( w1 [ v
b2[jj] = vec2[jj];
: J( Q% [ y* U7 Y3 Q }; ?6 e7 x9 u: e! a) O
; m- O/ X ^7 T" X' A% x' m
//Method - 1 N=100000 247s
% g# Q; ~$ k0 O1 f+ H3 T& ~ //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
. m- R' X5 c+ I0 Q , M. i- O, m6 p# b
//Method - 2 N=100000 237s
8 B- I! d2 J1 H /*
6 R& `+ w5 d7 M for (int jj = 0; jj < N ; jj++)2 q, z% t8 D0 S
{
4 J, T% Y% J" K$ L. x1 J# o9 J fresult += vec1[jj] * vec2[jj];' z F: o8 L' ?, _4 d3 ]
}2 O3 _5 G# b- Q
*// z. |6 ~- K( B7 m0 D/ T
" p' q* g: _/ P/ M) @ //Method - 3 N=100000 204s
7 f N! K/ x; z9 n /*7 }7 D+ N, N9 S. l9 c& [- w, ~
for (int jj = 0; jj < N; jj++)
: n9 F; G. X1 a1 Q) j* M& D {
3 X% }+ X; n7 Y! r fresult += b1[jj] * b2[jj];
. J, v. k0 G: X6 z- N5 _$ ~ }
+ T5 c9 Q& J9 g0 i6 A */
" R5 z3 Q( p4 X* h- Y2 l3 y9 i0 f5 ?( y" ]+ G) @2 n
//Method - 4 202s, N( v6 m* v2 v# Y
/*$ e# }$ B: P; p8 `( |$ M4 G
for (int jj = 0; jj < N; jj++)
, p. }$ r! q% ^" @0 ] {2 u: S0 f) ]% w' ^' t) j
9 C* `( g4 ]# k9 G* X }
. q! i! Q0 i( v/ ~0 Q; q) L' z */4 h- `, x; P" A( G! d. O4 H
//comment out all methods, N=100000 202s ! Y+ v& `7 E3 \/ H1 g3 t
} z6 U+ f0 t) w6 g. }3 h! O3 h- \0 f
/ ?- F+ q8 ~4 w# g& o3 }+ v* P. j3 r delete []b1;' [7 b! D& ~8 u' Y S% v. g
delete []b2; + N+ _: D5 N' y9 X% g5 W
|
|