TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 m l- _5 a, a8 b% H
) N0 ?7 c5 ]: t理了理思路,重新做了一个测试。
" T( X2 m: ^- d) e* o做了两个 vector 和 两个 float *, 都长 100000
+ W/ E4 W7 l" d外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.( c( U8 ^. D( E& \+ y# Q5 |9 i
: |+ h1 x- X: l. s1 m内循环试了4种方法,
6 q- M4 ]' S: C0 o1. 直接调用 vector inner_product 247s
) k* b) M0 z/ g" u2. vector 循环点乘累加 237s- E- i d0 n4 v6 @$ z% `! e; R
3. float * 循环点乘累加 204s- Z* O1 I# F3 A" P8 F) d
4. 空循环 100000 次 202s
3 w# o9 s! w! O
" @4 x% Q5 I" L+ \- k不做内循环 200s
$ f' K3 J. z* c+ i/ y# k5 M1 p, N0 T. I. j$ W) M8 a
你昨天说的对,内循环本身占比是很小的,大头在其他处理。( s& y3 N9 s! k$ f4 E8 @" w
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。; ]/ N5 ?) a7 l2 P. L- x. X* b. i
+ N1 x7 x4 Q! l
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
; |+ c- |: q C8 G+ x. z2 [7 H& p1 W" K! k9 E
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)4 O9 D7 t* z. L! q5 g$ ~# L. m, Y
' r' n6 z, g" H$ q- T std::vector < float > vec1(N);8 b" ?3 @) V) V: x4 {
std::vector < float > vec2(N);
" K `7 L1 O! p- X% f# `6 x float* b1 = new float[N];; I) E' F& p* }
float* b2 = new float[N];
8 e3 Q& J5 f* O, x) }) g
0 z4 A" U5 {9 a8 a; ?' C) d for (int j = 0; j < 6000; j++)
1 {3 q& @4 Z3 @* d4 r8 X {' h, a* x8 m& y6 j
std::generate(vec1.begin(), vec1.end(), []() {" l F8 }# P5 Q2 D9 }- t
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
# ~5 h Z- q9 L6 b });
?6 P7 I) B! a' _ K. a8 M' ` F3 T2 d: w3 s2 o. X
std::generate(vec2.begin(), vec2.end(), []() {
8 t* t: {5 ]8 `. {& y8 u3 v9 F return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;5 T: d" `* z, l; P
});' M; R5 j+ P* J- U1 ~# n: Q6 v. Q
) f8 M W, C7 \ p1 P: n! [) G
for (size_t jj = 0; jj < vec1.size(); jj++)# z" H) C1 j5 b8 k. k3 d. a
{8 ?- u( E/ g+ M, G( _$ r
b1[jj] = vec1[jj];
8 }4 D8 P: B# ^4 e% [ }) c/ ?, e2 e- \% T
4 G t6 T6 ]$ \* [$ R I7 g( ` for (size_t jj = 0; jj < vec2.size(); jj++)
7 Y9 ^. X2 D% M$ K# K {
: S8 g& E3 y2 S. @. I! Q5 b0 b b2[jj] = vec2[jj];6 c. I! w6 l: h* D0 X7 x% X
}
' T2 i( q4 S% J# i
/ a8 G, v1 X4 q. e$ _" F, g; Q& ? //Method - 1 N=100000 247s
$ i/ a( O8 j! l) m6 l* t //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);3 h5 ]* j- k! P/ I: l( O
* \8 L- g7 \7 z //Method - 2 N=100000 237s
9 J9 b; Y" r) F /*$ A9 ^4 Q' g& R/ r
for (int jj = 0; jj < N ; jj++)/ x5 H* S8 f5 r& j0 \( r2 ~
{
; n3 b. r6 G6 o5 _/ o) M# c" c fresult += vec1[jj] * vec2[jj];/ Q/ A( G" @+ _- t- C
}* i/ I* v" K; K2 k t( h5 p" S
*/- G1 G. x4 h1 a/ S; D
) Z- X7 j8 }# `$ ]
//Method - 3 N=100000 204s x5 O! x. G& d. g% \- {/ }; h
/*' Q7 w" I; F o9 f$ M# y* {( u
for (int jj = 0; jj < N; jj++)
" s6 e) t& h+ C6 Q- J1 `' V {& a+ ~# E# s" K- I4 ?) E: U
fresult += b1[jj] * b2[jj];1 `+ q, X* G1 v1 q) T$ f
}. h6 m; ?% M% G
*/
6 h- C* Q6 S$ X1 E' L9 x) [& ^* ]5 o
& F( k* `! J) j //Method - 4 202s% [. u( }- E$ Z
/*
+ z) t* @( P' j( w) ] for (int jj = 0; jj < N; jj++)
6 G; A$ k* {# x: L# w7 v {
! h' E: \3 F J+ H! s9 p
1 v* N" s* N( `* z0 o }. I+ I: o9 W' F) p9 Q: q$ m( N/ x
*/" j: I9 T7 U- a9 n8 a. p1 j/ ]
//comment out all methods, N=100000 202s " r, w! s2 [8 f, G9 R
}" J5 m- v% [! v: X" }0 ]3 I T
6 F# M3 O- u$ B1 C' y delete []b1;4 Q/ S9 _. T& b& {0 j$ c6 m7 Y' o
delete []b2;
! k9 w. D( A- O# w k# F% {9 U9 U |
|