TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 ; }, ^1 e! e; Y: Q* X
7 z3 d0 g* v; e3 f0 L% i
理了理思路,重新做了一个测试。# N3 x& M$ F! ~/ v: F! u8 e x
做了两个 vector 和 两个 float *, 都长 100000
/ r7 W" H7 }3 n# Y, M. X9 u外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache." \* R) `8 t! M( {$ h0 Z
6 Z, t! {+ L9 B3 E6 ?0 K7 Y内循环试了4种方法,
$ h4 L# u( p! J, b' T+ d, ]9 q1. 直接调用 vector inner_product 247s 8 G% z, |5 h4 N/ A( @
2. vector 循环点乘累加 237s
: Q9 |) q4 L8 t9 o/ E& y$ F% {3. float * 循环点乘累加 204s, g" O. }$ E E% ~
4. 空循环 100000 次 202s) J$ I/ D# t9 u/ B2 a& k2 g/ f
8 [2 x( S. P8 K7 R0 b
不做内循环 200s
9 G) i& [+ S, Q' u* J* M3 I4 {( r/ q9 m/ T
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
! a4 `3 q$ m ]另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。5 N1 g; p/ }3 ]' ~# T D% y
$ J5 n I9 \ {9 q. I& h& h$ }* B9 p至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
4 n1 q2 l9 G- {9 t( x; [0 Z
5 m% {3 e- Q3 y$ e% K5 x0 O7 q Y(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
$ O# u" z4 _3 D* ?* |3 W+ ~" _1 o' x2 J$ [* ~. M
std::vector < float > vec1(N);
% F/ x8 N' P( o' X2 |3 J m std::vector < float > vec2(N);" ?* s- r x( E3 z: F
float* b1 = new float[N]; D. i6 A& R* A+ I8 Z$ u7 d
float* b2 = new float[N];
) f/ {! y5 A; A
; J: f' }- y% j7 `7 I' c- ~% ~ for (int j = 0; j < 6000; j++)' c. |; C0 q* W& Y
{
7 A: \$ H* |5 Y) J: M std::generate(vec1.begin(), vec1.end(), []() {
) \; k; j* V+ m' _# V return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
- x L' i# P% t! v });
R' E) R! p& `, H1 p+ Z' F* e5 i* ~1 H3 R1 _- e( [4 U
std::generate(vec2.begin(), vec2.end(), []() {4 x& U2 D$ W, S4 L. T" ?; M& ]
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;4 B. B( v+ x+ y/ y
});
' a( y G8 U$ g6 M: E) ]' a
! }4 v& F2 R ^' w8 B+ E for (size_t jj = 0; jj < vec1.size(); jj++)( P: `# i5 S/ ^) x* h7 @: f. S
{5 ~5 U3 {: G4 b
b1[jj] = vec1[jj];1 q$ u4 p1 y( r1 A
}
5 v/ P, @8 A0 x2 l: r
. ~! M+ n g6 s8 D6 I0 i for (size_t jj = 0; jj < vec2.size(); jj++)
7 ^- u6 q i% M* c" N1 \, p# P {7 @4 L* R* S) O5 _1 w8 J, o) ?( [' U
b2[jj] = vec2[jj];# U7 q }) N: R6 J X
}1 i4 r% ~8 Q/ D4 y( Q
* ^0 ^2 V+ s" A- G //Method - 1 N=100000 247s
/ _6 d/ G* [* A; b6 c //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);; A3 ^8 b& r+ D( y
: S0 z/ Z6 E8 G/ O //Method - 2 N=100000 237s( g/ S7 T1 _ h! P6 C
/*" L4 K: _- W2 `) Z: Y5 Y
for (int jj = 0; jj < N ; jj++)% v6 G; [2 Y5 M' @9 z n6 \
{0 o0 Y5 W: e$ P- h/ a
fresult += vec1[jj] * vec2[jj];" `$ A. G" v, `" _( z' C
}0 m, L# u2 s: b- Y& R7 {, m
*/
/ Z/ f0 r' K! H, S' r: ?) q/ v2 }
7 g! \' T( N% x3 T //Method - 3 N=100000 204s
7 V- X1 e4 C4 b; J7 Y, o /*, }) l9 E* J9 f7 s) t$ F
for (int jj = 0; jj < N; jj++) q: `0 a+ n/ q7 }, w P6 d
{
# U( N: m. A, S5 r7 E0 Y fresult += b1[jj] * b2[jj];' | O2 f3 P$ ] F
}# E3 _, U( c. {( v; J# C
*/
/ f; X; E0 j& K, a. X3 v2 ^4 z& S: F% T
//Method - 4 202s% Z$ G) e S/ W! u5 M
/*
& \6 h! N$ |8 W% C+ A: o for (int jj = 0; jj < N; jj++)' {8 @/ @# B. I+ N1 N6 c7 M- ?
{) V) K& k& }, y; P1 Y! B2 Q
& c" l- k6 g, v
}9 |/ f ~( A ~$ @% D) Y5 c% V7 s
*/3 \. K5 b5 j2 L& B
//comment out all methods, N=100000 202s
) X4 Z5 H. J. w9 D+ @0 c! r }/ |/ n' i6 ^# A" S) i6 p; m3 _% ]
! }6 L" \9 A: w* \0 a5 u
delete []b1;7 T' ^% e6 z+ s3 r A' l' G! t7 R
delete []b2;
, r% b' Y* p* N' }' ? |
|