TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
# B F7 F, [- f' ^# }; u) I4 w# i* b3 d: z! r/ p
理了理思路,重新做了一个测试。' z$ B* `1 a5 x7 N
做了两个 vector 和 两个 float *, 都长 100000/ C8 F" H. \1 X( Z6 o" Y
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
# W# j& r* M: ?: Y0 J
% }8 b5 ?8 v8 D4 M; [/ S+ e内循环试了4种方法,+ Q7 F+ R% J8 n2 b; j
1. 直接调用 vector inner_product 247s
* S3 ^1 f* ~4 O5 H* A2. vector 循环点乘累加 237s
9 G, E W6 `( u( T3. float * 循环点乘累加 204s" D! ]& D K5 e, t
4. 空循环 100000 次 202s
8 k; d$ B2 E" x% A
$ T: q. j+ F! V) N3 [& M不做内循环 200s
' w) T/ t# P. p* c0 n! a# e4 x; t3 Y; U& x- m6 M5 R
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
* f( l; b5 s0 e% x6 G另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。" b* g- M8 [7 k0 p/ k
, y X6 o( F/ S9 c# B6 C# L- K) J5 g
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试), `9 g# u$ N% L4 J }/ W
4 x( x& o$ \' S
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
, d; ?" b( `0 I7 x5 U' k! }4 z$ c/ t: v u, _
std::vector < float > vec1(N);% \! c) ?# P/ g
std::vector < float > vec2(N);+ b# m- F( v5 R* Y$ K, n7 N. E+ _4 f) b
float* b1 = new float[N];0 m. l. b$ ]) z" j+ f* q7 M
float* b2 = new float[N];' R( q ~; ~4 A. h3 e' R
; K" m: K) q$ }: Z! K# y
for (int j = 0; j < 6000; j++)
+ V) ^% [. I$ S* H {. h1 r8 {7 H2 i' X- \
std::generate(vec1.begin(), vec1.end(), []() {) M. b+ H" D1 F2 H: d
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
9 A& P( I' H9 W });
- M5 H( b3 y" g3 }0 R5 j) q) ^2 i: k$ F) _
std::generate(vec2.begin(), vec2.end(), []() {
/ P6 |" H% ?9 `/ c, b |3 f& }$ M return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
( _6 G) I y% F( K" l });
: U F e# k. C6 p# a" L/ p J! d! P) _
for (size_t jj = 0; jj < vec1.size(); jj++)
! K8 U% Q# x! c! I; ]1 c {& a( Q( a* T$ l! ` i$ |5 D/ n) k
b1[jj] = vec1[jj];/ a, H- F8 Q( r9 E5 K4 @, ?
}" T$ F9 d# n/ X& ~( r
, E1 S1 U" b8 s) b2 n n1 a( I
for (size_t jj = 0; jj < vec2.size(); jj++)
* P R) g' z0 G! e2 ^6 B {" k) Y" P6 D" {1 W) ?2 W" n9 T
b2[jj] = vec2[jj];9 A! e" P+ v8 A7 H) u1 V% y
}* m+ |* Q! U/ R0 o; o/ J% v
" m0 i3 b4 i9 T/ P1 B
//Method - 1 N=100000 247s 8 K2 s1 ~' \- y. u3 j1 e& z, W. M
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0); d3 J& V) O- d# q
# s$ m% j5 [! M& u* Y' [* S9 G* Y' B //Method - 2 N=100000 237s( v1 J: l' f) p3 {4 E
/*
) h6 @& V0 C6 a for (int jj = 0; jj < N ; jj++), j1 {9 N) }$ R: Q8 e: I6 o/ X
{
1 G0 `4 N Z3 M9 \) C! o8 Y fresult += vec1[jj] * vec2[jj];
$ N* f# q! o/ h" F: y3 ^/ h }
! \* j; Y" M: {3 S */
7 K( R% _5 y3 P, B7 M0 ^8 q
9 |6 ^! X: i& I5 G# S //Method - 3 N=100000 204s* E# c- b; [# B {) r# m8 }
/*5 n; \- {; _0 m, C- Z+ G
for (int jj = 0; jj < N; jj++)
8 D# A* @2 U! t! m/ X {
2 U. k. P5 P2 U* P' l0 k fresult += b1[jj] * b2[jj];
1 l% e3 Z# Y2 `& S }2 K! Q8 |( D: E5 g% M% h! ?
*/' Q8 b) L# O# A4 Q! }) X
. l) w/ P, y& z: b" @6 S
//Method - 4 202s
9 w/ E- X5 [& w! ~. O /*
! C' @/ m# r7 @ for (int jj = 0; jj < N; jj++)
& {) J+ `! b9 w+ l$ a! { {& _ X1 o2 u ?* u, A3 Z
# q! _& O$ b* ]8 _: ^3 `3 \ }
% W0 R- s- E# ]$ k/ Y: k */7 u! t+ [& ]" N$ g( A
//comment out all methods, N=100000 202s ( r: m* S& U# ~4 B" ^" |# B# i
}! M+ e% d J& a1 ?: Q3 A
3 O* L/ o9 q+ V6 ?& A delete []b1;
' I$ \# k& G1 g; g' Q delete []b2; / C6 \, s9 g* W# x7 S; E0 _7 x
|
|