TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
& { \5 W1 d6 B5 Q/ G' k5 V' P% y% i: i0 T) z% J
理了理思路,重新做了一个测试。& L1 h& g* `! {0 f
做了两个 vector 和 两个 float *, 都长 100000. Z2 P9 n, p# W3 @' i3 R- r
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
# k, ?2 z/ L+ c. U: P2 U
9 ^# Y8 @' t5 L6 b内循环试了4种方法,
/ M, J: B4 b. V+ p s; T1. 直接调用 vector inner_product 247s 4 e4 I& K1 z6 T4 t5 E5 L* C, @$ X
2. vector 循环点乘累加 237s3 H, p$ J6 i. ]6 z" ~/ ?. {+ `, z+ ~
3. float * 循环点乘累加 204s
* M5 e( c' F$ J' b& o4. 空循环 100000 次 202s
B7 g6 b! q1 t1 U2 |4 S; G2 _' I4 w/ ?& d' e- u+ c; O' d. O: m
不做内循环 200s
0 ~& B4 g/ ?# V" T- q! k& G, J C$ P- L4 _
你昨天说的对,内循环本身占比是很小的,大头在其他处理。% t; W9 [3 }$ q# p
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。& O+ J! }" Q0 U
8 ^+ v7 X9 d) ~" ~/ P/ E8 W9 H至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)( g- {* x; l4 B, {4 {
- ?# e' H$ y" B# g# l(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
( {- i, ^; i& ?. k9 B* k a4 ]' F; Z0 |
std::vector < float > vec1(N);
! r4 W5 k ]! R+ v std::vector < float > vec2(N);
2 A' c2 k$ b$ D) u) E4 M: u float* b1 = new float[N];' I! x( D: H, r9 N/ l' S
float* b2 = new float[N];6 z4 i) t* S9 Y/ A3 P% F5 u, I" c
% E2 l8 E* V$ t; L
for (int j = 0; j < 6000; j++)5 w! b8 I% h: G2 y
{% n7 N$ v6 \9 r1 R, G/ u9 b* f
std::generate(vec1.begin(), vec1.end(), []() {
( y E- F1 A$ ~) G return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;, Z' |# [! t3 ]: C" L7 y' t
});
' J* v' U6 E) l6 K5 a) E7 a$ v% T9 u; v% ~: o/ Q* Y) @* ?
std::generate(vec2.begin(), vec2.end(), []() {
2 [& \0 p% b& b4 t/ A return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;, z* O; z8 N! j
});
7 N4 }& D# }+ o% T
) X, S) J7 F: a( Q6 p" U" i5 Y for (size_t jj = 0; jj < vec1.size(); jj++)* l$ F3 E; }) {' n# T( }6 b2 N( b
{2 }* J' I. h/ {5 Z" a. F# [. k
b1[jj] = vec1[jj];
! u8 \8 E) L% I. ~7 u; ` }
1 u+ q6 d1 q' c' ^/ A
* I% ~, j8 ~4 v& ? for (size_t jj = 0; jj < vec2.size(); jj++)
9 q+ q7 \* c9 G2 ]& _' @ {
- R- H ]4 u U) i' s" f b2[jj] = vec2[jj];
0 s: S& I6 a) I/ F }
+ H9 p1 O3 V% o! I4 N! h8 a7 G& L
//Method - 1 N=100000 247s - y; N1 P+ C* g. \3 D6 n8 P
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);( r% `/ ^5 g: `: j4 j% D) M
! X- y# A& J+ } t. o
//Method - 2 N=100000 237s
$ p. y% H0 v: f, }6 C% [, n8 ` /*
& ~6 d9 ~. r: u0 B for (int jj = 0; jj < N ; jj++)- |) s9 w$ H/ T+ |" k& R6 g! ~
{% ~$ s, a l; |% @
fresult += vec1[jj] * vec2[jj];
0 |6 ^/ a" n& k7 W2 [; T6 ]/ i }* ~" X" R" s; m
*/
0 G# {% f& { ~- Q* M3 D5 @
9 X _7 J" m4 P. ~1 k //Method - 3 N=100000 204s. ~9 |: T" a* S: q8 k
/*
2 C8 G+ o% k& v8 ?/ j4 e for (int jj = 0; jj < N; jj++)# k4 t9 G3 a7 _8 ~
{; U& o- n3 T. H* o ^
fresult += b1[jj] * b2[jj];- E3 K3 M9 ^% W6 [
}
8 f u! k4 [8 C" {& e0 I5 B, X */ R, I1 \6 I3 l6 P4 c; X
% m2 ?' S4 V; J: ?! A4 c$ t, L
//Method - 4 202s
( x2 h- w- M0 ` f/ I# i /*
* i Z$ C0 d- j+ P/ X, \ for (int jj = 0; jj < N; jj++)
3 e) f- `, O7 i7 ] {
2 [, F! X1 T) Q 3 g& ^# C: [( @) T f/ V' r+ e/ w
}
( C: B9 K/ b- z2 @7 o2 D */* t3 r- D* M# m; b9 |
//comment out all methods, N=100000 202s
3 [, }2 |3 f1 H0 h! l }
% X, s- C, Z/ a \, y' P% J- U" G4 ~" E& D( L
delete []b1;3 t6 G" S" {. d8 G
delete []b2; $ {3 u3 i. x6 O
|
|