TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
G0 H' P4 B1 o& w& K2 ~( W
1 ], U, v8 \1 s, F理了理思路,重新做了一个测试。( x" D, q0 C) D+ B2 j& M/ S
做了两个 vector 和 两个 float *, 都长 100000
3 ~% \5 E2 }" ^. U" F外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.8 x# x8 e0 t' Q$ ~3 U6 X: d g J. V
) s" t- A/ t* {4 C9 e6 w2 k4 b% C1 R
内循环试了4种方法,( W6 m: k n$ E# \
1. 直接调用 vector inner_product 247s ! b: X2 k, w3 F
2. vector 循环点乘累加 237s: J/ B0 e5 ]$ |
3. float * 循环点乘累加 204s- h% g' H8 f _, l5 @- R
4. 空循环 100000 次 202s! A1 S. i, r$ ?5 V- v0 d$ o" F
; W2 h4 E5 B/ s9 G1 s* J不做内循环 200s! x' J2 l) {, m# K' V
* j h. _: D+ x1 V6 M9 @* l* z你昨天说的对,内循环本身占比是很小的,大头在其他处理。
& u4 w! c- J8 I% T另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。' T) w$ ?" L) g4 h s6 n+ F
! A- }8 S' j$ t2 K- b
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
( B" [- ]4 J9 f6 @3 l
* |" q7 }8 _- B(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
, ?1 A/ h# n& z# E" D7 n* ^. Q6 }) f9 s& m1 L- w4 V* s" k
std::vector < float > vec1(N);. u0 t9 e; V- a. u
std::vector < float > vec2(N);
7 G) q* N7 K& F8 L& X4 K float* b1 = new float[N];7 h& ]- J1 \; \0 i
float* b2 = new float[N];
' b2 o8 K5 C6 o& K- a8 W
0 H+ A- x+ ?$ p! e& l' B for (int j = 0; j < 6000; j++)
2 s. I9 @$ i, U" V' c! {( p1 Z1 A {7 b# [% v! H: H. ] h% ?: J3 o
std::generate(vec1.begin(), vec1.end(), []() {
6 N5 K+ v: ?2 v( c return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;4 \, Y, c( j" \
});8 |! |* d9 E* L9 V2 f; K- B3 T
5 \8 ?: {" Q* Y' y! Y# d$ T9 O std::generate(vec2.begin(), vec2.end(), []() {( S- e' _0 a" }: e
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;9 u4 I9 _% H( x7 F, T4 M2 u
});1 D* S# k, j8 m2 d% i/ w. d$ M
* P% u+ F( j2 l2 @
for (size_t jj = 0; jj < vec1.size(); jj++); D4 u( C5 K$ P1 E/ T, A% L; J
{) D' P$ c3 M% ^
b1[jj] = vec1[jj];/ z A. a4 \3 G6 U3 J& m( D0 _- J
}7 {0 E; k; b3 [8 a
8 F" O8 Z( ]% d3 u! j for (size_t jj = 0; jj < vec2.size(); jj++)5 L3 X* v& i/ @: @
{
: [) b, n2 q+ ?0 q5 M: T O b2[jj] = vec2[jj];
2 d* U# n+ Q z2 k# X2 X }
) [, ?9 ~$ p! |! S2 y/ R% u; Y6 H- b
//Method - 1 N=100000 247s
6 F, s$ i6 G9 f) V4 p //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
# G$ g& T9 a% z
# K8 h; k7 N. d; U3 ^* d //Method - 2 N=100000 237s- W% M Y- @0 {6 ?! i
/*
& Q- ]2 C% A3 V/ b& R) h for (int jj = 0; jj < N ; jj++); O9 F, a4 [5 ~) U G8 b+ t2 U% B @6 X. R% d
{
! ^9 @. A6 S) X, n8 W9 W! K$ W( q fresult += vec1[jj] * vec2[jj];
& Z" g* m* x. u$ w9 Y; }. |3 o }
/ m6 k0 ^* Q( G, { */; {2 Q! N4 b# u: a+ _- j
! r- m# ]( _2 F0 b, |9 @* L. K //Method - 3 N=100000 204s
Y" Z8 h; a. T7 z0 O4 E /*9 }' e. n$ c3 u( c4 N
for (int jj = 0; jj < N; jj++) d, }; b# s2 L8 t
{7 L1 ?* y4 U( i7 T! B5 I" n
fresult += b1[jj] * b2[jj];
$ J9 G( e+ v3 v1 p# u }( j+ \$ n' n+ B, o/ a) Q4 Y
*/
: e0 h' L% J2 J& J" [/ ]* ]3 f- ^4 h6 ?
//Method - 4 202s
6 M; H, P- N7 r' {0 u3 S /*
! S* n- m% }1 K6 H! O5 r( i for (int jj = 0; jj < N; jj++)1 q. ?" o2 [0 Y+ t- k
{
( m5 ~: Y4 [6 w2 P 3 W- a" H2 a3 L* u( H1 Z% S
}, t6 G2 H6 }8 d1 B+ x& C! f# E
*/1 k1 U- q; ~# f0 q6 w
//comment out all methods, N=100000 202s
) F: O( q9 D- W+ y) M& b }# p8 P- c) M b6 E6 a- k
5 r) \8 X& e9 p: Z; {+ s0 `! Q
delete []b1;0 ~3 }, E9 R" w4 z! [
delete []b2; 7 c& c* L, D9 v6 E
|
|