TA的每日心情 | 擦汗 2024-9-2 21:30 |
---|
签到天数: 1181 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 " D4 F/ p( ]3 q" v. N; Z
$ D7 G' [% \2 m: p4 d& D4 h理了理思路,重新做了一个测试。, c) b* ?7 ^& y9 M1 |- k/ Z
做了两个 vector 和 两个 float *, 都长 100000
5 [0 x. N i7 }8 Z/ }外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
! N( n0 g! i+ f& S0 c' R+ R
4 B7 w+ D1 Z3 u) ]( j. A v1 {4 V: J内循环试了4种方法,& x. v" l- g' J" i7 j/ G M
1. 直接调用 vector inner_product 247s F2 p( Q( [3 a) D z! j
2. vector 循环点乘累加 237s3 o1 E- q$ Z: i5 L) }5 B
3. float * 循环点乘累加 204s
4 J, r' T. s$ W6 K. t- J" `4. 空循环 100000 次 202s9 D! o- k/ m3 j9 S( v
" z" [7 Q6 A" k/ u! K( y! W不做内循环 200s- x0 V }& @* ? z
1 _5 X; [: q; M7 }: ^
你昨天说的对,内循环本身占比是很小的,大头在其他处理。, u# Y" B, ~5 H- Z
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
1 |4 ?9 e; _+ c, {, B
* N9 f/ Y$ B: w3 p6 c8 I& f! e至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)! W+ t# b5 k$ O$ j" F
+ f' g& v8 r- b; a3 M
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)6 l/ o. ^9 X! y9 K7 T7 t
9 f+ c3 D x' e9 p0 l! c. _ std::vector < float > vec1(N);4 ?& y; R8 g4 Z! S: E% f$ s
std::vector < float > vec2(N);( d# t2 p- F$ P+ ]( c
float* b1 = new float[N];( C7 A! ^$ i2 ~0 _5 L- t
float* b2 = new float[N];" C) G$ w" w/ L) e' t
. e/ `" {" G3 X9 U
for (int j = 0; j < 6000; j++)
4 r4 U w9 z$ F9 Y) ~ {# Y9 U' b& w$ _- T. U' I
std::generate(vec1.begin(), vec1.end(), []() {& W/ ^* g, L: F' P0 x+ X% E
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;1 C3 \; M, d- i, E
});
l" e: d# C6 \
Q. W( J. m" Z& q& c8 v' F+ c std::generate(vec2.begin(), vec2.end(), []() {5 r" D6 J, O, ^
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
x! g* z3 _) }/ [+ T });
, v; I. a$ L$ a+ d3 A/ n
8 W9 [ [9 ~% [% } for (size_t jj = 0; jj < vec1.size(); jj++)* M' S( C! o+ I! { M* r! N3 R8 ]- Z
{( Y) D, Q$ \! W. G, X p" p
b1[jj] = vec1[jj];
) }' j1 ]$ B+ g9 r+ a }
7 C, I- [8 N6 c K/ s5 L- Y2 s: ?% c) z8 ~% ]2 x- l, ]
for (size_t jj = 0; jj < vec2.size(); jj++)1 x. N' d1 _7 j* |) u
{1 P/ B3 Z5 [9 Z+ c3 a) x% p% F
b2[jj] = vec2[jj];
+ b$ u5 \' C8 W2 K: ^! r }( K5 b9 t5 z1 K# z0 b% {
" j: i5 L" G2 k. n- x. H
//Method - 1 N=100000 247s - [2 _) a% ]0 [
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
\- A+ i3 V- R& w 5 ~& ] X' O7 R4 Y* x
//Method - 2 N=100000 237s
, q% I& V6 C0 I2 K( A9 x /*
) Z0 T8 d) P* h( x. w for (int jj = 0; jj < N ; jj++)
1 S4 D& y, R7 g8 M! _4 v+ A% E {
0 G. R4 E3 Z( ?% e fresult += vec1[jj] * vec2[jj];
9 M# k3 D% A3 v- t2 P1 s2 x6 _ }/ Y8 \" s" r, W# \# i2 R6 x' u D( l
*/
* R- C+ Y, n7 }: h _# D # h! l; b* R$ {# |* L# ~, S# a* l
//Method - 3 N=100000 204s& q& z* D+ K; D/ X: p: A1 D; R
/*
# [6 l' ~% ^8 R, n for (int jj = 0; jj < N; jj++)
' [, d3 j t* e0 e {
) I, R" ^( ~ |1 ~ fresult += b1[jj] * b2[jj];; J* J2 f4 B5 S) `
}9 n% J* W, J1 I% ~
*/; Z b' H$ Z# W8 R8 {5 F2 |
9 M, k( c& K# d //Method - 4 202s% B; d) A5 S, ?5 Q) S, ?
/*4 G. }8 P; c5 n/ O- d7 J4 o
for (int jj = 0; jj < N; jj++)
9 t7 B: x0 K) {2 f, o {
- \8 f1 C+ X9 J ! L' T1 ^( M: S. a
}( B) U3 Z7 ?; o/ o/ e# \
*/! J% \& v% C/ i- Y
//comment out all methods, N=100000 202s
& T, A' ?0 o& ], O0 ~5 ^ }
+ l; P$ M( L# C! E
! ]0 m" u2 Z+ F8 G delete []b1;- {, Z( a4 X5 K: C
delete []b2; 3 p7 I) U+ A" V, G9 r' ~% a3 u
|
|