TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 : p4 }, Z- g8 G
! N% u0 f$ O( g& G' h' g1 d/ r
理了理思路,重新做了一个测试。) r6 ?& i( d, D: p6 p r
做了两个 vector 和 两个 float *, 都长 100000
5 z5 F; Y( z) w外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.9 c8 p5 X$ D5 T+ e1 b) J; N
9 F" G- {% N7 q; Z3 m- p内循环试了4种方法,+ k5 F U$ Z" C, K( S( D: n
1. 直接调用 vector inner_product 247s
9 C( s7 M! I4 w3 u2. vector 循环点乘累加 237s) n2 B, Y8 O! `2 m4 h: }
3. float * 循环点乘累加 204s, l4 L# a: O) X( i8 X
4. 空循环 100000 次 202s( T1 w% t$ r' ?/ |+ \2 o
9 L$ F- t. q5 O) o u( o
不做内循环 200s
( e# H, |/ r% [5 l' a! ^
0 b1 J' ?& x" |你昨天说的对,内循环本身占比是很小的,大头在其他处理。
$ B, N- h! H2 u/ m另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
9 R; {0 E& p y& [, ~5 y, p' `
9 X+ a. Y7 R q' ]0 U% M+ F9 ?4 p% a: S至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
# m8 U) p- ], Y: h H( t+ m
P( r$ P6 a$ a" q( h(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
/ F% d* ^% } A8 I; d9 i
1 }, c! U8 x* }$ a% Z; l ` std::vector < float > vec1(N);$ o: B F! P6 y; @+ l) n
std::vector < float > vec2(N);
. X$ u1 B! W* z0 v, r# y float* b1 = new float[N];+ X2 [1 n: B0 K2 u: ^8 J& \
float* b2 = new float[N];
- ^* A c( b* p( s6 e" p# ]# ]$ O5 ?1 q# H O8 V! ^0 A! g
for (int j = 0; j < 6000; j++), ^, A8 m$ P+ v9 ~% _& ~7 j
{! @, ~$ s4 X- C! Q0 Y0 r7 I. N% ?
std::generate(vec1.begin(), vec1.end(), []() {7 c( C. z/ ` q! D
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
# r# |0 y" G2 m# F });9 e) l& w, P: d. P+ b3 H# y/ {" w
* k7 k1 D. F2 ]' c7 f4 D3 h/ B) m std::generate(vec2.begin(), vec2.end(), []() {- \( O2 }" }0 E
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
Q% J: Z2 p3 | });
) J1 @) z) a4 k" g6 o/ B% I# o2 |! O( K- G* n
for (size_t jj = 0; jj < vec1.size(); jj++)
" V- |- ~, [2 O9 H- [ {8 s. ^+ o- N. W9 O( F: W
b1[jj] = vec1[jj];. c. W0 J7 }7 N
}
' S. D, K4 k9 g' m" x) I: C; }% D& `* X" E+ y! |* H
for (size_t jj = 0; jj < vec2.size(); jj++), m! ?. V" D5 H. T% u
{
% R+ P) `. v( W: f b2[jj] = vec2[jj];
- f6 ?, _1 v! E% l7 F }
5 L& [& f+ ^1 I; |/ I8 v
2 Q* }- n+ ~5 I% \* }) |$ a //Method - 1 N=100000 247s
/ `& J% d. r! Z% |0 n$ [ //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
% C/ r+ _* k! b8 d8 R" r
E- Z) \" o4 i$ _ n/ I1 G //Method - 2 N=100000 237s+ g3 |8 m$ U* Y* {" W: c1 i' M, D
/*
% U, Y# L P" z! }! Q for (int jj = 0; jj < N ; jj++)
4 W N3 E o- S5 S4 @4 [ {) D" }9 Y4 d8 O! C5 a, i0 ?3 \; Z
fresult += vec1[jj] * vec2[jj];9 y- b; R( N1 f+ n0 R5 C: r
}
* o1 ]" \& B, t+ w. {1 d */) s# H/ y9 O: {. J% c$ H
1 w4 S3 h' H; e5 i: O* W7 u //Method - 3 N=100000 204s
, l' Z$ L4 \' U# q /*
8 \$ u8 [& f& W for (int jj = 0; jj < N; jj++)
, T! l8 `" H. k& I1 g {
; ^ T& s, G0 I fresult += b1[jj] * b2[jj];! A4 B' I0 i" @' l
}
$ e! S4 w# l! Y/ M' Z */
8 x! ]" e: F1 y! \0 d% p+ f$ b5 c1 C- s8 Z. S" w, a# L
//Method - 4 202s
. C. O) B4 |. z: k' q. Z8 H /*& S* ~3 ?3 p" w& {/ F) G, u
for (int jj = 0; jj < N; jj++)
$ B5 U* Y% U. b' e% q1 D {& W# a& g1 l. S; Q& L
6 `' b# Y8 o) P6 j; z/ c! X$ y
}! r0 z- ^ F) M+ j
*/3 s7 \% ] L3 A/ A) ?
//comment out all methods, N=100000 202s
J: q: b, d. H$ r! \" N }9 c; s6 t3 z9 u3 ?0 L2 D
0 N, ?! G8 R& ]* r8 h& }+ I8 r delete []b1;0 `# m3 ^4 u9 ~+ S
delete []b2;
0 p! n- [0 j$ b0 k% O( u$ F4 ~5 I |
|