TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
7 S# C! f4 v7 q( g) N8 p n; }/ F
理了理思路,重新做了一个测试。 Z: c/ }+ ~/ j
做了两个 vector 和 两个 float *, 都长 100000
% I) m' W' a0 v$ C外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
; B; N' I6 x$ Y; ?& b5 J* ?# u' R8 R- o6 ^% B
内循环试了4种方法,
8 l" A8 [* y9 E' l4 f8 T) E1. 直接调用 vector inner_product 247s
}0 x2 I3 c3 ?9 {$ m* H2. vector 循环点乘累加 237s
1 Q& d+ R; ^5 y2 M2 H: J. J+ w3. float * 循环点乘累加 204s! r8 W% n8 p1 i. p
4. 空循环 100000 次 202s
* u2 U! X5 a' u4 L
& T l4 G2 v5 H( k! b5 I不做内循环 200s* h! M3 Y; i- H8 K3 _7 A8 f
: ?5 x7 Y" |: Z
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
( Q) a" s0 B- m: Y# R9 q0 O& X另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。2 W/ W) Q- m" w0 m
. E3 J" b( o- R
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试) b0 |: o+ @ R# D( l% M/ b5 S z
% C% ^* J+ Q' z- y(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
# s+ \# S% x# N! ^
/ Q9 g L; x: X! ~* E3 u, i* [+ C std::vector < float > vec1(N);
2 P0 e, |1 I5 B+ l0 y& n; ? std::vector < float > vec2(N);
- d- L% w6 |8 ^4 ~: C float* b1 = new float[N];9 U& h/ P) L' _
float* b2 = new float[N];7 n5 A! L) W' `( ^: b
9 @, U( V" D; r3 A$ N
for (int j = 0; j < 6000; j++)
4 C1 y! w0 t0 H {
2 H# B, l* v9 j8 \3 p5 G6 Z8 o* d+ I std::generate(vec1.begin(), vec1.end(), []() {- C+ @! ~# i6 z; |- P& L& Z. i. n* C
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
* P+ f( [- [; `3 o; e2 s) }, | H });
0 P) D1 {; F) T9 z4 Z: Q5 \" i- H& L7 T: E& v
std::generate(vec2.begin(), vec2.end(), []() {" E% d! Z1 W- c [" n. }$ E" I( m
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;$ d' \- {: Z. ^0 s, X, ` G! c
});
6 X. w5 p" i- O
7 F8 t% ~- L9 t' n1 g2 S7 d for (size_t jj = 0; jj < vec1.size(); jj++)4 `( H" x3 B. C! g0 K Z
{
, Q7 L0 @; j" \( w4 L) m0 a, P4 C+ | b1[jj] = vec1[jj];
- B! y4 X7 b& w( m7 x }1 N1 d: w1 R; F2 A) i
( \ E; i) n% n0 Q
for (size_t jj = 0; jj < vec2.size(); jj++)$ b1 K) E, `. `! \6 D2 d" V
{
. G5 n8 U# a, }1 [ b2[jj] = vec2[jj];
: D5 l& J& K$ R. g }0 B. F# C; ? A) i
* @' l6 q8 G5 `, u1 E" ^3 c //Method - 1 N=100000 247s U1 C6 N# j2 U. I7 b* R V
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);, f2 W5 ^6 H: v+ Y
* K/ n" n4 ^3 y8 T. j: @: H
//Method - 2 N=100000 237s
* A* ]& I' Y; I- z; A4 ^# K /*6 Y( k$ m, S5 ?+ n( T, B( _; d$ L M
for (int jj = 0; jj < N ; jj++)2 V# h* a Q; t# |/ G3 X3 X
{
. Q7 a# M, j: F& t0 F7 Z- W& f( ~1 t fresult += vec1[jj] * vec2[jj];
: y% W8 t9 }/ ?1 U: W2 ^ }) x# Y& y8 Y3 ^; |
*/
0 d* S3 j- ], z S, W3 D
+ L: n" g: W' p4 }/ ^ //Method - 3 N=100000 204s
( }/ @* a$ M9 r( c6 @ /*; \' m& X+ T' t/ h) Y4 d
for (int jj = 0; jj < N; jj++)
: R4 L- m% x! K4 ]3 a9 g; }& O" F {: a# |: T x# H9 }% ^0 I; o
fresult += b1[jj] * b2[jj];" k; _ w) Q/ r, u
}
6 }/ S' i1 C x, A */
/ a6 l6 C# @0 H+ s* |: a9 S0 c1 J, G% x7 h6 M
//Method - 4 202s
& _& t: B! {# s/ f /*
$ H5 u9 @' J8 M3 E for (int jj = 0; jj < N; jj++)# t# J+ r( H6 ~% w5 |2 ~6 v
{7 i6 ^. U( L$ k2 m, G- } n
- C* k3 F& `0 H- o* `
}
* K7 L0 z9 r- u. |* a *// B* I; e" d- p$ P
//comment out all methods, N=100000 202s $ }2 P; S4 I( v5 o4 n$ D
}, E" M" S/ \; W1 Q
8 i. A4 ^3 t" b; z* c6 d4 e' D delete []b1;
, ]' S4 W3 Q2 l* ~ delete []b2; : j' w/ M8 j) l% O) y
|
|