TA的每日心情 | 奋斗 2024-3-29 05:09 |
---|
签到天数: 1180 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
2 a. s' y6 @& v& z6 U0 {
5 H$ T+ K. ]" G) C: i. H理了理思路,重新做了一个测试。
$ P5 Q, B1 y; X4 y做了两个 vector 和 两个 float *, 都长 1000007 w2 P# y; W3 J( H7 O# Y
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
5 @4 m7 O: f y$ i# c+ v/ z& R- h( H! ]7 q
内循环试了4种方法,7 z" r% a8 P b0 i, t7 ~5 X
1. 直接调用 vector inner_product 247s 9 i3 P- P( u$ f7 ]5 r
2. vector 循环点乘累加 237s
: t, Y T! F& N" D' b1 u+ A: z" A$ _ t3. float * 循环点乘累加 204s, w- A$ C& `# |' j
4. 空循环 100000 次 202s% Q8 X6 ]4 p9 E; J1 h
* z6 n3 F" A; Y# W" Q9 D
不做内循环 200s
5 `# D* u9 L# Q
& F8 i8 ?. z' `; {% P# J你昨天说的对,内循环本身占比是很小的,大头在其他处理。
; c" R n" y+ H8 w. \9 Y另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
3 h; _2 [& F' T8 r2 E" O$ N5 k9 Q7 u) Q
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)( d* u2 _+ p- n* ]
6 f9 T' S9 Q2 u) q" O/ M$ q5 {/ N r0 c/ N
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
0 }6 `4 b4 |* @: ~$ M! B6 ?7 _9 Z
std::vector < float > vec1(N);
% @. R6 P8 H* ?5 ]" W6 j std::vector < float > vec2(N);
! P8 S' ?, `& P$ I) N float* b1 = new float[N];1 j# i0 k7 Y- }8 v9 n* R' L
float* b2 = new float[N];* T2 ^3 j' n3 V+ {* n
2 H# [# F3 K, l" u- ~
for (int j = 0; j < 6000; j++) j; t( Q: Q+ [% e* P
{2 b0 e9 j! u' X+ F' ?
std::generate(vec1.begin(), vec1.end(), []() {% m: b! c, y) r n8 p
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;' B; d+ i# Q* m
});1 ~, C6 O3 I: k$ |
5 y. r( ~- L2 H7 k
std::generate(vec2.begin(), vec2.end(), []() {
8 C1 U; T7 H6 Y& Z return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
3 O+ e+ ~/ S3 S. t9 M2 ^, N$ r });" g1 ]+ m) Y' f
6 R: ?8 t* z0 f8 n! I2 m
for (size_t jj = 0; jj < vec1.size(); jj++)% }: r$ Y* ?" r3 S; V
{
* `$ m6 S8 K! | b1[jj] = vec1[jj];
- X5 f% `" a+ k0 r& r! e: W }7 d- G0 @& F _3 P
( A1 W2 J' t% }1 P. u# y6 O8 t/ x
for (size_t jj = 0; jj < vec2.size(); jj++)
7 a1 v) |/ D& `4 \1 I1 f u {* M/ W! m4 `5 [/ H' \* I
b2[jj] = vec2[jj];+ X' ?* e _$ t. n& U1 M
}
9 t; T/ B r" g$ O( r& k) `3 H9 k1 X2 t/ G
//Method - 1 N=100000 247s 7 B& Q' i5 Z8 ? [7 p: j
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
% t: O/ V3 E, L% J # A& w; `2 i) \9 z7 b1 V
//Method - 2 N=100000 237s- R$ ~ V. U0 [% R* z) T# n! s
/*0 |# ~/ G5 W, }6 s
for (int jj = 0; jj < N ; jj++)
9 N8 ^- Y$ D: h7 e0 I1 _ {* f* `* t& t: N7 j$ K# }
fresult += vec1[jj] * vec2[jj];! b$ u( H: k4 Y$ l" L3 Y- t$ F4 i
}
1 k- v6 l) P. ]/ f# y6 J0 [6 ]+ `7 k9 ~ */
* ]6 j6 V. ~, W g2 q% N. g 3 D( S7 r; B: V8 _# c
//Method - 3 N=100000 204s3 ^6 l2 `! N2 _9 X3 i( K; ?4 A8 z- n
/*
+ `& ?; V* X, s3 q4 j8 } for (int jj = 0; jj < N; jj++): h1 T1 n3 z: h# A' H
{
0 [0 g3 {( R+ f2 j0 K; w! i) V fresult += b1[jj] * b2[jj];
; ^5 u0 m Q% D7 r* t$ M- [; I! k }
" T2 S. ~; u# |" x0 }- M */
4 I: I: z- l4 \: u' R3 U, c8 Q* \4 A2 d' y. a: C( ]- o
//Method - 4 202s
& r3 e3 ?% C( e) I& x: M /*
4 Z; a. O' d; D. W for (int jj = 0; jj < N; jj++)
8 X2 T5 a) s4 Z8 f% ]9 L# ` {+ F) ]' S) m/ x% L- U! ~+ \( A
. N& i0 B, A6 C( c/ l! O( f }
4 X5 ?2 a+ @( O: r5 T */
; e, U6 W1 k2 B2 P9 { //comment out all methods, N=100000 202s % Z% u1 Z) q2 |* s( M v
}
1 V1 Z' b4 J" @. W' ^7 s0 J0 G+ ]( K3 q9 N2 Q
delete []b1;( d7 ]8 J* f _
delete []b2; - K; e9 o3 Q* R3 ?
|
|