TA的每日心情 | 奋斗 2024-3-29 05:09 |
---|
签到天数: 1180 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
/ |: k6 G5 U0 _$ ]/ v; w
E- ~1 v" j# ~3 [$ p理了理思路,重新做了一个测试。1 ?9 v' I2 k5 v; \! ^2 b+ B s: Q
做了两个 vector 和 两个 float *, 都长 1000006 m, Z. M, W0 c1 t; W$ A6 K
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.9 P0 I/ b2 F% Q: v$ }* t
: F# u5 g/ C7 a( y8 e1 b
内循环试了4种方法,
8 f# Q( o0 w& c [+ t0 m( G1. 直接调用 vector inner_product 247s & F; t' Z/ R$ t% S @5 `6 \8 h
2. vector 循环点乘累加 237s! a' h5 i7 o, \0 @0 t& Q4 O
3. float * 循环点乘累加 204s3 H! X7 V) ?& b1 A) l* G% }
4. 空循环 100000 次 202s! u. g5 r- L. r0 X6 {9 N8 Z
; {1 V6 `" B. k不做内循环 200s
) [6 F& y9 l6 A% Y4 v' J- z
2 a9 V- {1 \4 @; t9 ]: \6 @0 M你昨天说的对,内循环本身占比是很小的,大头在其他处理。
2 L5 J- p w) u- D9 R另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
! [! Z6 C& b0 ]& i) b, l/ A# p) ~
; g9 `4 F: w) m8 i6 r; A6 K至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试). C* g6 {! n; Z8 z
. [6 o8 q7 \+ j4 ]+ | W. v(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)+ r2 }; G6 `: V/ U4 C. w
1 O/ ?+ b3 ?: C6 C std::vector < float > vec1(N);
; c8 G5 \5 Y8 {/ l" q% ?- R `9 S3 y std::vector < float > vec2(N);
- A `! F' j6 s' P% f float* b1 = new float[N];2 u/ Q( `: c+ d- U4 v' F, H
float* b2 = new float[N];( N7 o) v4 x' o
* T# F/ s* l1 }3 o for (int j = 0; j < 6000; j++)
6 _% n- ]: i. Y7 w$ W1 p {
# V9 i9 ~5 R% G6 e, e: G9 u std::generate(vec1.begin(), vec1.end(), []() {
! o# ^5 `7 Q! S7 k: x return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;+ x" \( a1 j( l- \5 J- y
});
9 P* i1 p% ~% |" o. z+ {$ U+ D& w+ ?9 \4 n4 I
std::generate(vec2.begin(), vec2.end(), []() {0 t. |. ~; u6 J# E0 F
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
1 i7 o! i3 i7 z ~7 n! p) B });, u/ E7 v5 A6 \5 N( G
' c; b" Q) ~, }
for (size_t jj = 0; jj < vec1.size(); jj++)
$ w& I3 O) v& Z$ d {: i, M# c# S4 P' O
b1[jj] = vec1[jj];. s1 A( L& a, h+ Q. o
}
, X, V9 \0 l/ F- j; D- K7 [, X. @* B o! s6 U3 e; [# N
for (size_t jj = 0; jj < vec2.size(); jj++)
: W* Q8 B- |+ ?) z( Z. a1 a {) | L: J2 q6 q6 x; D+ Y7 K
b2[jj] = vec2[jj];9 n D; ~3 | u# b; ?7 |, P0 P. D
}
! |$ f `: @3 A0 W# ]3 ^9 J* K$ H
1 P- @+ d4 v7 F/ @ //Method - 1 N=100000 247s
0 X" J- p0 g1 |! q ] //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
, ~4 ~% z0 x* H4 T6 B
0 L& N$ N( K- C$ p: K, e* a //Method - 2 N=100000 237s
. F' @; Q" L' @8 p" o0 j /*1 y! P: W7 ?3 b9 @+ x* p0 ^
for (int jj = 0; jj < N ; jj++)
9 z- p' n) @- T2 }, L+ \ {
: H% [0 G! v+ B. H2 c! X& w+ w fresult += vec1[jj] * vec2[jj];
- r/ f3 i9 g2 x- i }
6 K3 m& p5 N$ ]4 e */ l7 T! P% r* F% M5 g7 [, c
: o( @1 [$ e8 K
//Method - 3 N=100000 204s, W, B# y! J B: C# j z+ C2 L
/*3 a) n1 M) a. W( K! ]+ @- K: A6 V
for (int jj = 0; jj < N; jj++)
# Z. ]9 a* M Z* F6 p {
- a' i" b$ V. ` |% U fresult += b1[jj] * b2[jj];
5 m, M( @/ i' P! @5 \ }# \# V: M) i0 n2 ~/ \/ ]
*/
; b9 M! b! g5 U# E7 ^) X3 n$ x/ Q: D' O! x4 b4 C( L9 j3 g
//Method - 4 202s
1 l3 Q, s: z. z /*6 T8 }! y/ V9 p4 Q
for (int jj = 0; jj < N; jj++)' T) A6 \! r; R5 q9 f5 | S4 f
{
4 J, U* l1 Z0 k8 G6 r0 z; I0 ^
/ x$ o8 F% t. Z) D- H }
% r6 b7 b$ Z U; H+ [1 P */+ T* z; [ X& g# @8 y
//comment out all methods, N=100000 202s
& V- l: x& T) F }: I5 C# u$ ^. k2 l! h3 a
% }5 l- k+ r, E0 \' ~
delete []b1;
/ e) K; L: C7 F6 j5 Q& I* L delete []b2; ; k5 ?! N+ d7 J6 P
|
|