TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
, L6 B, G* L* }$ ?5 v! v i( ^ o$ b' x" x5 r
理了理思路,重新做了一个测试。" k3 e/ p, K! k$ y
做了两个 vector 和 两个 float *, 都长 100000
! I9 }+ J& ?# r外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
1 S3 M( E; h$ n. g
! F% M! j h9 i" i7 J1 g内循环试了4种方法,
4 N1 z. `' a4 N- M6 _5 U8 ?1. 直接调用 vector inner_product 247s
( ^. ]% n6 s( i# Q2. vector 循环点乘累加 237s
5 F% O) W+ H' J; N3 [5 E& D8 W0 H! h% d3. float * 循环点乘累加 204s; Y4 t) l) S, t* j: E- F
4. 空循环 100000 次 202s2 g: u) s# X. ~1 y
% G0 n) \$ D, g不做内循环 200s
( O/ S& L8 R7 ?
# L& B3 b* I ?* M9 k你昨天说的对,内循环本身占比是很小的,大头在其他处理。
# W3 ~7 A2 L9 b% X& R另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
- c8 \5 K% F% W, c0 B; U" X
A4 K. E/ J7 m- F+ g; g至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)3 _- {& ]% C) D: _
: Q4 n5 W" I# ?; q) |, C% B j(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
& q. R( O1 ?$ E
1 {: {3 c6 x. o/ |* g& P std::vector < float > vec1(N);
( t4 b* K& O7 { w1 Y; _ std::vector < float > vec2(N);
/ A& S* j9 @3 m9 v# u8 d7 ?( K float* b1 = new float[N];
5 t/ G6 q+ l9 \3 C$ [9 T4 S& H" ]1 K float* b2 = new float[N];: E3 \2 f9 [! r+ p
& D8 g- d) F& m V
for (int j = 0; j < 6000; j++)' L; g0 A6 ^- f' l
{
3 ]& I7 ~4 g. g* V) I std::generate(vec1.begin(), vec1.end(), []() {
2 T# ~% [: ~: G return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;* x2 Q) M+ _5 r" W2 Y. x9 `
});
, p1 {. I3 `: O/ b
5 y" c4 c* [; L3 D( w std::generate(vec2.begin(), vec2.end(), []() {! ?0 g+ Z8 X. F1 F, ~2 a3 _
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;7 m: w# D. ]+ Y/ d
});
2 l( z. ~7 T- r3 n# Q/ ?$ S
/ ^/ \9 U. d) e; j+ v8 ]* r for (size_t jj = 0; jj < vec1.size(); jj++)5 D8 Y+ \4 Z5 a1 i3 `& B
{
3 [/ i6 ~, N; U V0 n& t! w. D b1[jj] = vec1[jj];9 J: X( y2 H) W" ~: ?# f
}+ L G( C0 w8 ?2 K
, z1 C- `3 _1 |# R
for (size_t jj = 0; jj < vec2.size(); jj++)
( o% q; {, o; B$ y4 x$ L1 s {
+ ]+ Z8 w/ J9 E$ F5 l; F% m& k b2[jj] = vec2[jj];
* I0 i2 _3 T( u: A& R }. \) c! Z. S5 A( l: S
/ r+ e; q k! W$ h: @% J1 _ //Method - 1 N=100000 247s
5 r, R; l1 Y! v. u( D0 b1 | //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);+ ? W% h; k5 H+ p4 x
8 f' c& v5 P7 p. O Z& k
//Method - 2 N=100000 237s
7 \( |" U' A6 B+ l9 O: }% u /*
+ x) A) X' H0 H6 I0 S9 O: w& F for (int jj = 0; jj < N ; jj++)& Y6 t8 v4 Z& n6 h8 _
{
; m- x; }: E" X' T* e fresult += vec1[jj] * vec2[jj];
! B( N6 D& m% v% |, ]; D }
7 `& S) z8 ^: R6 ?" x/ Z */0 ~9 t- W3 m p! r/ O$ x9 }3 Q
5 J! `& T i' U/ `3 r$ w6 y: J
//Method - 3 N=100000 204s9 ]$ o" p O5 H3 p- m7 w
/*3 `: ~ Y; W. S. Q* D6 K' G. D
for (int jj = 0; jj < N; jj++) N8 D5 p( n+ }/ U3 K: Q; u' ?
{* ^- g3 J1 ~. r6 b* l3 N' _* f: }
fresult += b1[jj] * b2[jj];
, G2 _4 U, C9 N' m5 r5 f% f% u }
' G) Q* c; d# K K" ?2 a' R6 C */
* e( |; g4 w( r5 ]8 }, z. j6 N8 o' j. x7 F$ z3 T/ p6 G
//Method - 4 202s2 x) k1 p! c! D( M5 P
/*
$ |2 O2 w" {/ k6 k for (int jj = 0; jj < N; jj++)
' ]2 W2 A- \) g {
6 @+ K$ ?5 U5 f7 U: M+ H$ W / K- F; |9 l/ R, M) C1 `0 L
}' p" U/ b' `* c7 B3 U
*/2 ~1 `# |' g% P0 n2 a
//comment out all methods, N=100000 202s 6 D9 j% o! F0 j3 h1 @+ P- C
}
$ e0 Y! u [5 f- c1 W. T( k
3 f6 b4 i$ V5 }0 q( s* l delete []b1;
8 e( e. ] K) k delete []b2; + G7 y( V- e$ @! O/ d, \" v
|
|