TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
& _1 T9 j# ~$ ]
! u& H! {8 o& ~# E3 _5 ?6 D理了理思路,重新做了一个测试。; |' K# J1 u" g/ D' ]. W5 \! H
做了两个 vector 和 两个 float *, 都长 100000! ^; F) N6 }7 G
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
+ V! w! p# Y6 Z! t6 R2 J8 H6 D$ Y9 ?. C; c$ [0 _0 B
内循环试了4种方法,
, ^" y+ t" I$ R4 N$ P/ C7 t& J1. 直接调用 vector inner_product 247s 8 v1 E" I, }+ z+ e# c2 X! z! L( i
2. vector 循环点乘累加 237s8 f- A& c! b' L9 A( v5 M
3. float * 循环点乘累加 204s: y. c3 n& l o# W) M9 b+ r( }6 \
4. 空循环 100000 次 202s
( f( p' W. M- ?1 h% w
6 U( F! p# t f( `不做内循环 200s
[7 J8 c, z) X% R3 {" Z
, T8 C) e D: |+ T. }, A! @你昨天说的对,内循环本身占比是很小的,大头在其他处理。
4 i. Y/ u2 V; F N' s: T5 S另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
9 X! R: \; I+ v: }/ h
- [: x: b. f- D& U至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)' ]' k4 F" P7 Y8 d$ I
/ T" L( Z8 v+ D6 I3 \, m4 m3 h(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)/ W6 O* \( ]9 `9 v8 C$ o9 B. Q+ K6 G
. c' F ?, y4 c, U std::vector < float > vec1(N);
4 W% E; B' n, Z4 \* o$ ]# Y& F2 G std::vector < float > vec2(N);
& z5 }: S7 w) Z/ K float* b1 = new float[N];
- L& j- ~6 Y% B/ [- ^- d1 ] float* b2 = new float[N];
+ _' U6 }/ ?7 r* {/ q3 z2 ]* U) P1 s& ]! T- i6 B
for (int j = 0; j < 6000; j++) @! k2 l9 Q/ P' b. D9 L
{' }! T/ i4 ?; o
std::generate(vec1.begin(), vec1.end(), []() {0 f! J @2 p6 \3 o0 e
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
. y( T# A# Q! b/ t# p });
9 S1 c# q ~6 v2 d# s
4 _2 b2 x5 B D0 J std::generate(vec2.begin(), vec2.end(), []() {1 E0 W+ [: n Q: W6 z
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
2 Q2 s% s6 \( T6 O: W/ N/ e });
& r% D2 E2 N7 z6 T/ _8 {3 ]" ~. H5 `; P6 l1 }+ i( x N
for (size_t jj = 0; jj < vec1.size(); jj++)' Y. ~2 {* n$ Y, ?( u
{+ @) v* V0 }% _, O+ \1 b- o1 T
b1[jj] = vec1[jj];5 X* A: T* }& ]- M
}
' z5 f* X+ T: F$ i8 \
( v" \2 O- _0 U9 {/ \- p for (size_t jj = 0; jj < vec2.size(); jj++)' C: P- N9 W4 m! z5 ?9 R5 ~, R
{
9 f' ]. E! S3 e/ U. f! V b2[jj] = vec2[jj];
; I. K. ~- ?' g9 h }
( R4 `, ^; V5 l" x1 Y" m) ` p6 c1 F% G. [
//Method - 1 N=100000 247s
9 c! G. C) c/ H( w& Y //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);5 L( L# P& O& g! j6 R
! `; r& m7 }! W+ S //Method - 2 N=100000 237s8 j& [8 h6 _5 F$ H' v) O9 `
/*
/ b* t6 O" `+ D, `+ P& O' z for (int jj = 0; jj < N ; jj++)
; }. o7 N0 H; h# u {
9 [- z; l3 l: x3 _* n( c {! p fresult += vec1[jj] * vec2[jj];$ @& b1 i4 A% }9 k6 ]5 ]! F
}# k0 a' o; e- p N7 J w
*/
( U# A6 G' \! M, E" h/ I3 h( I' @
. ]! |7 ^5 F& Q% }4 W# z //Method - 3 N=100000 204s( K# o2 o' i% n
/*
* v) U# q) T% A& o4 m. d for (int jj = 0; jj < N; jj++)) `1 ?. J7 O0 F7 \
{
. o( A3 d$ S: ]+ o' v+ h: D3 s fresult += b1[jj] * b2[jj];
7 |" F# w! r9 V( y; q }
( X: s) ~! B$ ~ */* V" B7 @ R! a4 w
6 O: \' {! b! Q& G; k
//Method - 4 202s7 _2 X0 Z% ]% T# c+ R- K
/*
/ M8 I- \5 `# c& T2 a5 z for (int jj = 0; jj < N; jj++)" J q3 a# Y7 a# _
{& G2 d2 s( }4 ~
* q1 |4 l1 \- @ }
' P3 H- [ h" U8 B, n */1 T/ x1 E" F6 \0 D
//comment out all methods, N=100000 202s . Z$ y3 Z3 R' s @9 E. z
}
0 s. z( T* v3 X* d: M6 q! t
3 H" |# {6 G7 \ delete []b1;/ c. M, N2 I" E
delete []b2;
0 W' Q% B+ C$ M# ? |
|