TA的每日心情 | 奋斗 2024-3-29 05:09 |
---|
签到天数: 1180 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 ( R4 n( h9 }& t4 p7 {
: u0 K. U! b$ I& m+ |* H6 _+ W# C. C
理了理思路,重新做了一个测试。
d6 i$ a% y/ i做了两个 vector 和 两个 float *, 都长 100000
7 r8 k F% W5 ?外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
" z, _; K5 I4 _' I2 o5 E
! ~/ B6 a+ |4 X* ~0 o内循环试了4种方法,
1 Q2 l- @1 ^( N: `( B7 j5 M1. 直接调用 vector inner_product 247s 5 G9 A) f( r+ M8 x+ D3 i3 Y2 o% W( w
2. vector 循环点乘累加 237s
: z( x% H2 y G3. float * 循环点乘累加 204s8 b& q+ d) a& P9 P) ^8 V! u
4. 空循环 100000 次 202s
+ p( p E! W4 M" H8 d3 Y/ W4 Z. m0 K; @& }, u5 g$ ^7 G& ?
不做内循环 200s
0 h1 p, i1 d' P8 \& ^7 `
/ N$ `7 m9 K+ a& L6 a) \7 m7 I你昨天说的对,内循环本身占比是很小的,大头在其他处理。" Q8 |6 A4 j, g' ^( ~
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。8 m, N6 e8 M8 P0 v- g
9 E( w7 ~" k6 I3 i- B至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试) |, N5 p& Q6 N8 C2 v, L& W: y
) V& P. U7 t' c. s(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
) g1 G1 G& v9 c+ Q
( @, O7 @; W6 V* t std::vector < float > vec1(N);, e: O7 i _# R$ _& `
std::vector < float > vec2(N);
& E; X2 h; o/ H$ i( a, U+ i float* b1 = new float[N];8 w8 K3 o) ?. J/ a6 ^8 r) l
float* b2 = new float[N];
+ D2 m5 N% N' g/ T. v
3 v' T4 ?5 u" y5 Q5 u1 m& `4 D1 a for (int j = 0; j < 6000; j++)
, Z. c, Q: _7 S8 j4 f {/ c3 {( Q+ ~& z% V( y
std::generate(vec1.begin(), vec1.end(), []() {( l# q4 V# n- e! w' N. I2 U6 i
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;: x7 r& P4 w5 |6 B
});
, ~) q* |4 l) @- ?7 O/ S( j, l% c3 y6 {% v
std::generate(vec2.begin(), vec2.end(), []() {1 R' n& _$ u1 z, v: S6 S0 h3 ^' q
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;( h% e' a( P; t% Q9 R0 `0 q
});
) }8 G& ? {) [* Z, G
" l, V' Z6 w3 ?& m. ? for (size_t jj = 0; jj < vec1.size(); jj++)
. o* L* L0 i9 p! a* O {2 E, G, _! N$ [& H
b1[jj] = vec1[jj];
/ g9 b9 k5 j. b J- I }: n; n: T- K6 q+ c
% c1 E% D* N3 N( S8 ^' A for (size_t jj = 0; jj < vec2.size(); jj++)2 `1 j- W/ X& o- @0 ~* {
{. g( K5 b; k. @8 K& x9 H, v
b2[jj] = vec2[jj]; ]% d6 S- D8 ~$ S+ ]4 ?
}
3 K# C" p: p0 @% B. p0 _9 ~9 ^8 D1 d s1 C
//Method - 1 N=100000 247s $ X; i. c& j. }- T9 R2 J
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);* w% H/ @6 _% @ m' e/ ~( t4 b
, `& |$ a2 a0 X: J+ g
//Method - 2 N=100000 237s
6 N! r3 ?3 \2 N! |- w /*2 s! J7 ?( n2 @" s. H1 u n. U
for (int jj = 0; jj < N ; jj++)
: o* V' s! c6 `$ n4 C+ [% m {
0 Q' U! P( X. @7 i fresult += vec1[jj] * vec2[jj];
5 x- H( U8 {) H0 i# o3 e& X }
6 d- q D8 F: ? */$ y! M | q9 j
) {2 f# W6 k- x. ]; E, w T
//Method - 3 N=100000 204s
# L+ u+ c4 N; A! ?3 h) }! S /*
0 e) Z4 R( w& n1 A for (int jj = 0; jj < N; jj++)4 K' J7 g v8 r; L$ b
{9 n. m( x2 y! \; j" m; c, v3 p6 {
fresult += b1[jj] * b2[jj];
( E" G: }, s$ y/ g7 K; O# \ }
# l/ i( c$ ~. {/ E" y */! q+ S/ `$ L7 e3 s' d3 ?1 D5 W9 |3 t
7 Q% U8 C E% `6 P
//Method - 4 202s& C- h- \! H" Q7 m( _8 k
/*
5 R. [& j( A$ |- q: |0 g$ |) d for (int jj = 0; jj < N; jj++)
3 W- g- A* {- r8 o$ |( O {
8 @3 ^+ K* X- c5 @- C & Q" R1 g- u. l/ n3 ?( S2 L: H% }
}
7 y/ G+ F- [. F: B5 Y7 u */7 f/ J0 W5 x2 b0 D7 G/ I U& q; S
//comment out all methods, N=100000 202s
& V/ A* b. `) b/ [! R F) }& d }
7 W( m2 o) M, v; Q! }
4 {" B {- \5 f8 H delete []b1;
* [3 w5 `1 \7 {/ V8 z) V$ d delete []b2; 5 u' J/ l* V9 b
|
|