TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
; V8 }! [2 S( O
& U5 Z& g0 g! A$ O& W7 h理了理思路,重新做了一个测试。
( \# C$ h5 l% A+ k6 f做了两个 vector 和 两个 float *, 都长 100000
3 w$ X! h! i4 |+ E o* A' V外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.: C R9 G$ B2 h2 D A0 b
. H0 I: m& o6 O
内循环试了4种方法,
2 `2 N8 }8 g3 Q/ ~* B, Q* T& K( j1. 直接调用 vector inner_product 247s * c7 E' f; M% M3 e
2. vector 循环点乘累加 237s
! o" E& q, ~. H6 U3 b3. float * 循环点乘累加 204s8 W4 o: [. f1 R6 f* s, L! q- H
4. 空循环 100000 次 202s: n, v/ L/ i- D' ?- u3 n
. m4 D* `, m) S9 {" n/ o
不做内循环 200s
& M- @) k8 @- P I1 D- a* B/ V+ ]& _$ R- `' X
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
1 B6 h7 |* r- V- `9 v) W另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
( E: l7 w7 f+ {1 ]9 `4 G4 c r9 I2 Y1 h: P9 |
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
! p* S+ \/ }9 X0 j! U. {! r! t& p& o
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
" S3 P+ c- k& \$ {
o1 w/ }$ @! x1 J* Y" v std::vector < float > vec1(N);
) l* N* i5 N3 h- ^/ ` std::vector < float > vec2(N);
% P% a' ~: ?7 x. c float* b1 = new float[N];- x! }$ f8 x/ H2 I) V
float* b2 = new float[N];# m, @# d( ]1 I6 f0 j! K
' _) S7 T: P5 f- U" F for (int j = 0; j < 6000; j++)9 ^1 O' n; ]! c: P5 A
{! @/ g% x* x5 \* y3 y: h5 W
std::generate(vec1.begin(), vec1.end(), []() {! G- C% B O5 {9 {2 C# }) Y
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;4 z7 L! ?* s; c+ x$ T- \1 g
});) ^( D5 `3 b0 \5 o
3 m/ b; F7 t# I std::generate(vec2.begin(), vec2.end(), []() {
5 T, }8 l# h& N5 q+ q return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;+ Y0 b; H0 m4 W9 n3 f- n4 P: e% D
});" m4 X) Z$ Q3 h# F! M
/ ]# b, x% Z+ j/ u- D7 I4 h for (size_t jj = 0; jj < vec1.size(); jj++)
6 M! L9 v% L. |: q {
, t( _$ a8 w7 f2 H: Y" ~3 D0 j b1[jj] = vec1[jj];+ _6 s$ T' r, @) i+ E1 [) ~
}
7 Z" \: }, J/ B0 n
6 Z; K1 u0 D/ x9 K5 R: G0 U; n+ f for (size_t jj = 0; jj < vec2.size(); jj++)1 L* z; z9 c6 \4 K" \/ q
{8 M& D! n( S4 H
b2[jj] = vec2[jj];
% H9 E/ N7 y. ^) z }
! @: w- u+ c$ n s) z' b/ O- k8 ~- q9 f1 a! {! @
//Method - 1 N=100000 247s
' ^4 w6 _# K# c- V //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
$ ^- K5 v1 W( ` E+ S0 R" Q4 d / ~- h, V, F G! J
//Method - 2 N=100000 237s
# R( P- W4 g2 R- m /* X9 l. N4 T, ~
for (int jj = 0; jj < N ; jj++)3 J$ [# i, K" U$ j
{6 Y8 w7 C' p) F n* @: S
fresult += vec1[jj] * vec2[jj];
8 g6 W$ u: _5 s o8 s }2 D! A& Q- Q9 H% f9 }/ y& s" G
*/$ _" |# ?% x1 t0 g4 i3 A0 d! R
4 _. x9 E) c# A: H1 k' X9 l
//Method - 3 N=100000 204s( w: i! C6 \" z2 j9 ?5 A
/*$ {5 d0 D* d# e0 q( E; J2 c1 Y- p8 ~
for (int jj = 0; jj < N; jj++). @9 f( u" U. m* n+ }
{, k: I+ w) a8 X4 t
fresult += b1[jj] * b2[jj];
1 C' ]8 c; T' t2 {/ {+ J" R }
( I1 B7 L3 p, `3 ~2 Q z */
5 u) _; C' ?+ K$ c) c$ a) N7 S3 i. ?- ~
//Method - 4 202s1 g/ J% o/ W |, G- \
/*- h7 m9 w4 q& ~( \' w% O- Q
for (int jj = 0; jj < N; jj++)
8 _2 e5 j/ |+ O2 s {' ]( f) t" A: S K% q0 W& n/ @
6 {5 ^4 J& _/ O. y% J
}
* y7 J8 U3 c8 z. V */
+ n' y, @& J# U' G //comment out all methods, N=100000 202s
- f1 p) b+ Y! a* L! q" h/ V7 Z }" H& @0 }' O: ~
; i8 Z% Z; K5 V
delete []b1;
6 p9 i5 P# Z' s. y( P delete []b2; # N* L6 X5 g3 h& J
|
|