TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
" r$ T. Y0 o( d4 L: b
8 P. d8 n) G2 G$ E' @4 |理了理思路,重新做了一个测试。; Q1 y; T( A1 P, r% d9 _
做了两个 vector 和 两个 float *, 都长 100000
5 z! _6 }& m; ^0 E外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
, _4 k- X- ~% O& G4 z( j) }. F
: G2 r! C( }0 v1 S. U内循环试了4种方法,
5 H3 e& F6 k& W1. 直接调用 vector inner_product 247s 1 m$ [7 a B. R) Y+ y0 L3 n
2. vector 循环点乘累加 237s
1 f0 X! B' K) @9 f# N3. float * 循环点乘累加 204s
6 j+ P# r$ C3 R" v) _4 j4. 空循环 100000 次 202s* x* `7 e7 @% \% R h
- t" {( x4 i# o8 n+ t' m
不做内循环 200s. r; v+ n, @, o8 Q) k' \/ c
& t- v8 I6 ^. E) u# q0 B0 Y& q
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
o0 e' ^ ^ t0 h4 W- G9 F2 C另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。0 ]0 |2 D( o2 h* `% K
& Y8 i/ s2 Z' x4 s3 L9 o
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)' Z+ Z/ m" u9 b. w7 O" c
1 V2 @3 O2 ^' v7 y$ k(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)* L7 B' A. {- K) v/ M" I) q2 N
6 |; J5 ]; q* J6 t& c! E2 ~
std::vector < float > vec1(N);
+ ~2 i" ^3 | G std::vector < float > vec2(N);
' K8 |( j H# r) m- x D) F/ X float* b1 = new float[N];$ n) H% P: d4 h; U. D' f4 g
float* b2 = new float[N];% a& y: l* h- A) F- I9 a6 ^
2 a6 O/ o3 G# y, y: I for (int j = 0; j < 6000; j++)
: R* f" Y6 f# F3 q, {$ p' Q* f- P9 K {
0 e0 {+ l0 p: ~# W, d$ n std::generate(vec1.begin(), vec1.end(), []() {
: v4 ^5 G# y* `$ `, s return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;9 W4 W `! [! \! S: p+ ^
});
5 T" v4 e& p+ u! P! K4 f
/ }- c: I) ?( M3 g std::generate(vec2.begin(), vec2.end(), []() {* m" n' l! M* ~
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));; S1 G1 F- F) A: e4 F3 `# J
});" Q/ e$ X4 x0 i6 h: O
1 b& H6 R4 R. S* _. S8 ~( Z for (size_t jj = 0; jj < vec1.size(); jj++)& T, ~/ Q' \' p9 G% G
{
: F, v- P8 ^3 a# C% `5 H. | b1[jj] = vec1[jj];
0 K( r i* E u) M6 {6 z( K! { }6 O4 V. q/ I/ e7 q" B
/ |$ L1 K, v/ N; I
for (size_t jj = 0; jj < vec2.size(); jj++)
- r8 S3 Y/ @3 m4 K* c6 x {" b$ ?; {0 m' D2 S2 F/ Q
b2[jj] = vec2[jj];
8 ]( x* s) D7 T! q" q8 Y6 `+ p }
% S% Y2 p' h2 }8 P' t3 ?
! T+ |% I# G6 K1 ?- q //Method - 1 N=100000 247s
7 f0 i, R9 H$ J p( C, \- L //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);" a! C/ w/ B5 k/ ~
, f. j7 j* ~- U+ v
//Method - 2 N=100000 237s
) @! Q' D+ d; u N6 H* D- j /*
2 c# Z0 D' ]( @$ t" S for (int jj = 0; jj < N ; jj++)2 E" i7 Q3 Y0 {9 f
{
% R/ E ]3 X& R0 B7 ^- [6 _& A fresult += vec1[jj] * vec2[jj];
7 w& A( D2 P& r2 L }
3 i* @ j* I" v) }; v; F5 Q */! T0 Y5 M& O! |- S: D1 H8 F' Q
7 k& ^' H: M7 l5 C6 r //Method - 3 N=100000 204s
1 [* ~: R2 t6 F. ^' u# t w- }5 ^. L& } /*
9 d4 v9 X, H5 q P' k for (int jj = 0; jj < N; jj++)5 C$ n& _" c5 n
{
, T$ o" L% d5 D5 K* K fresult += b1[jj] * b2[jj];, G. Q1 v& i! c
} L- S5 ^0 d- p3 L+ A! A
*/
* D: ~& J1 f n' F# S
1 |# S# ~# x3 w7 U //Method - 4 202s
1 o) _' p& `$ P2 B( F# E8 ~4 M /*
1 _& {' v B; a$ X" U4 U: m" T for (int jj = 0; jj < N; jj++)( U2 k& N% T) _0 e; J; l& m% z) T
{
- ~8 q5 e/ r: ~) s9 _0 \ * a& v! h( T) M8 ?' @* f
}8 d j D3 d3 z i) w5 O
*/ m, ^6 c9 i7 v9 o/ r. I
//comment out all methods, N=100000 202s 5 v9 a2 \! j6 Y. ?; I2 z
}
6 ?, G3 M8 A! K% {* ?1 n8 ]
! B& d4 k$ m0 n5 f6 C* K) u+ H delete []b1;3 G4 v* s. g' y" T
delete []b2;
- c" C5 e1 t5 w |
|