TA的每日心情 | 奋斗 2024-3-29 05:09 |
---|
签到天数: 1180 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 5 P# Y1 z% s6 y1 }
. c# l3 ]8 S8 u; d; s
理了理思路,重新做了一个测试。! v+ Q/ a/ B5 u9 v1 v' k
做了两个 vector 和 两个 float *, 都长 100000
2 a$ ?& m: n1 E* }外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.7 o7 ?) N- ?: ~+ p$ ?
h4 {) D# O0 d% i
内循环试了4种方法,% ~, _# l+ x. h. h( y+ U1 o7 A
1. 直接调用 vector inner_product 247s
: H$ H& e6 G i" B2. vector 循环点乘累加 237s2 ?) w0 C3 k& [/ m$ a. h
3. float * 循环点乘累加 204s
6 m" r) ?2 b" I q4. 空循环 100000 次 202s
# H+ l' k$ Z9 I T/ r
. z* e' d8 s& f不做内循环 200s
- T3 w( L& \( C b7 B. ?
9 J' c, y) G3 a- y, m% C4 T. u& U你昨天说的对,内循环本身占比是很小的,大头在其他处理。% _# o% X# _ z$ [; c0 Q
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
) `; H7 [4 B! D+ N9 K" E5 r* o S
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
4 U* G: _* |0 G1 j/ E( |; K
9 _' Y0 ], \9 d' e(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
1 e0 _' o: g Y. k5 J1 D" F
! P5 K( G7 H) D& H# Y- O std::vector < float > vec1(N);
n5 d- s) \+ J" d; [, J/ ` std::vector < float > vec2(N);
5 E5 V. r9 A Q j0 O float* b1 = new float[N]; p- _: W7 |4 l& P* d
float* b2 = new float[N];
6 A2 L5 C: T3 j, n$ F( k) s1 O# L5 N" \$ \% [- g
for (int j = 0; j < 6000; j++)( m5 l$ t: L- D7 l
{( r$ I U6 W8 J( E+ k/ v* X
std::generate(vec1.begin(), vec1.end(), []() {% S8 o1 @% H4 u2 X) {$ u
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;% H) ? v5 }5 M6 M3 f9 F9 G
});6 C3 f* ]2 z+ p e
1 p" D3 y7 _6 b3 n9 C$ @
std::generate(vec2.begin(), vec2.end(), []() {
- ^* h! `! g+ r4 P return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;) H4 Q, q. H ?' H8 l# [! U" T f9 j
});! D; }0 y$ X e _; e0 N
1 ~' Y6 Q Z3 I8 T( h4 [2 f
for (size_t jj = 0; jj < vec1.size(); jj++)+ P% i0 _; b1 m& Q2 B. }/ ]. y
{
! h0 q4 E$ M) h" U9 | b1[jj] = vec1[jj];
6 u2 b7 B7 P, w3 @/ M3 ^) ? }; P% |% J, \7 `
" \1 l0 @+ F7 b& g4 j for (size_t jj = 0; jj < vec2.size(); jj++)
6 E0 P. o0 m: [# i m4 F! L {
4 V) Q: x* z- c& L, Z; ?: j3 e b2[jj] = vec2[jj];& d' t3 n( h' x }: c1 o1 H
}
+ z- [# r$ z& e) M& z8 u
( V0 q. U3 K; m# h6 x& }' p //Method - 1 N=100000 247s & e( R# v& X. }( ?) i7 Q! Q! f
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);% o- H. d# }9 c+ v" ^
1 i. c7 U; G2 D1 j/ ], W //Method - 2 N=100000 237s0 L2 x9 [7 S# P% P7 M, D- b. B, c2 F
/*
0 J$ u3 e2 p7 B& L2 d& ` for (int jj = 0; jj < N ; jj++)* F8 N( p. G! Q2 h$ N
{
3 N5 Q- R) E$ Y! ^' D' B" Q, E fresult += vec1[jj] * vec2[jj];
3 S5 A! M |1 O+ u, [ }
; b/ Z4 s9 Y3 H1 c' F */4 o( r7 A$ a. d( m
2 w [7 E3 p% ~ S9 V& B3 a //Method - 3 N=100000 204s* Z- l6 v) R# C9 D( R
/*% q$ Q$ p: Z' t/ \7 R2 E: Y9 L
for (int jj = 0; jj < N; jj++)
- i2 ?+ C4 ?. \4 I% v1 I {, t# _' y p1 h+ @: ?6 t4 g) V* b
fresult += b1[jj] * b2[jj];
, o( N9 z9 ^, u3 q4 N2 e }
/ ^: a) I7 S+ D8 p4 N+ e: Q */+ p- Z0 \% P1 l: B: |
( W; S2 r0 k9 n9 G1 r7 D" [- x, `
//Method - 4 202s) N; T9 D. M( h
/*- ^* p- y: j Y# a
for (int jj = 0; jj < N; jj++)9 i" ?. g- _- a1 o2 p
{
" u% l+ R4 b' ^+ v2 u
+ _. v5 f% Y3 g. b }3 V* Q; \9 q6 Y* J
*/
4 N: J: w0 S9 w //comment out all methods, N=100000 202s 2 G2 r9 k. m* k4 ]+ ^
}
6 l- ]4 b* a& l4 Z
5 @! l' S( C* ^) I! P/ b5 v; f delete []b1;
, L5 y4 L' Y! H L( [/ N$ d. b delete []b2;
- S8 r. Z+ S; D6 F! \ |
|