TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 ! l$ E0 H& M+ r0 P0 b$ ], r
0 V( p5 ?! i& P* Z理了理思路,重新做了一个测试。
5 k0 E% L- t4 M* G8 E做了两个 vector 和 两个 float *, 都长 1000000 v! ~3 v7 ^* P6 I$ G4 H3 ^
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.' x* x- ^! N' O0 L) W3 x
4 i- ?# ~. m1 k4 W. P( P; v A, @' _内循环试了4种方法,
8 B$ Y z* \- |. R1. 直接调用 vector inner_product 247s
8 b, ?5 O. [0 c ]& Z2 {" e2. vector 循环点乘累加 237s$ @; e1 C; ]% u Q+ z) r8 [
3. float * 循环点乘累加 204s
3 s/ N( _ ?. d, n1 F0 O9 ?4. 空循环 100000 次 202s& d/ w: e. p* l2 F
8 x4 F( e" E' f' m+ d2 B* m* K
不做内循环 200s
7 i w% y' o& B: X7 d, M0 V/ C# J$ L1 X% d$ J+ G# O/ T
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
* p5 M' m" H& A$ S另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
- I }2 s3 E% V' ^' z& K# P( h" Y2 c% B1 s! K) E
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)( r1 L) i4 V1 B; }8 @
( }" k; y+ l& O! {
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
5 E$ y/ S1 I6 k5 I3 g& s8 J" x
9 U- [& g9 R4 `. @3 D std::vector < float > vec1(N);
7 V$ w* _2 e; G& @1 @) b* x std::vector < float > vec2(N);( l. Y% m6 z: K% ]
float* b1 = new float[N];) X) G8 j% j, d/ V4 L! p/ o! Z. B* y& O
float* b2 = new float[N];$ u# M2 y S8 a0 c. O. h
H% f) G' H. g. @0 ~* Z- O
for (int j = 0; j < 6000; j++)
( K# W, _9 c% e e {8 |" x. A- K5 ~' c8 E
std::generate(vec1.begin(), vec1.end(), []() {' B" G% F/ p) D2 {9 B3 F
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));; k7 q1 w& H# v" h
});
1 ]9 T7 l. C" a. z( y( I
) `6 d* |! G$ P6 u std::generate(vec2.begin(), vec2.end(), []() {' Y% c+ R/ F( S# J9 r1 M5 C z+ b
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
Y6 D. ^0 G( a/ j });$ W" v( m) W& l) y
# X3 E" o* v1 [+ B for (size_t jj = 0; jj < vec1.size(); jj++), X1 _+ h% V4 l: d4 o
{
3 Q6 r# l/ F8 T: F. [" L3 Y b1[jj] = vec1[jj];$ R1 A) G0 N5 m
}1 y; q4 v" j* m! W) C8 T- b
& R- B' Z+ A0 T% [: w! d for (size_t jj = 0; jj < vec2.size(); jj++); `8 l# a$ @- I1 s0 C
{( L- ?$ E% K0 v( \( k0 H9 n
b2[jj] = vec2[jj];
0 ?5 s: F, O! |% p% s( G }3 l; b/ g8 o, \1 I
! C6 m0 \ o& x" S
//Method - 1 N=100000 247s
9 H0 N! m0 R- r* h, j# j [5 Q- I5 g# { //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);3 E3 `( K: r/ h& e% G) r% X& H
5 U$ [) g( y, D2 {, U( Y# x
//Method - 2 N=100000 237s7 E9 Q4 Q1 s, j
/*
* k/ ^! b% Y- j6 J0 O# X1 c! t for (int jj = 0; jj < N ; jj++)0 |# a7 ]1 p3 M% z8 Q2 A Q
{+ a% ?5 W, P- g1 f6 q
fresult += vec1[jj] * vec2[jj];+ m) h1 R V: S" r+ N9 g! t
}
8 f9 v1 N |1 h" m; Z7 E" B/ t */8 o. e4 M U/ b+ P' F4 t8 X
v; G- L. X6 {1 D7 T# w //Method - 3 N=100000 204s# k+ g3 \8 \/ _& g5 i# U- N7 j
/*$ B1 y" x( S* |. b* ~; k: O" Z
for (int jj = 0; jj < N; jj++)
0 [. v7 }9 i! ~ m' P5 r( [ {/ O+ Q/ |8 ]8 S8 y4 Q
fresult += b1[jj] * b2[jj];
- j$ _3 M) X1 ]6 E& t8 y }
9 x3 ?' N( _4 ] */
u2 a8 X0 ]# \) ~
# r" C# q" u) b7 q: k7 Z //Method - 4 202s
# B; `, e& n9 x. x5 V /*9 c, W& m$ m4 A: b
for (int jj = 0; jj < N; jj++)
) D) d% \! |; C6 `9 ~ {; Q9 \- }/ p. `3 Y" y
. O7 e' l" T: ~$ k* M1 o }
& B* [$ H- I8 h4 j0 I! @ */! w' t6 E' Q: ^; @( b, u/ f, B: s
//comment out all methods, N=100000 202s . i, k2 p- t/ f! U) @
}9 D# l) D4 f) _6 o
. x5 |/ u1 M5 r9 ]" I/ S* g5 d delete []b1;
$ b0 O3 c, L+ ~" z; A delete []b2; % l# `: A% `6 u' N! l6 _2 y
|
|