TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 4 Q8 X, \5 P. J
. ~$ d- D7 [$ W. K
理了理思路,重新做了一个测试。: D) L9 m' S4 X1 w
做了两个 vector 和 两个 float *, 都长 100000
4 ^* ~2 M! v7 K; A7 A外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
: u0 R; _- ?9 y+ _3 ^+ f2 N6 O; H% g8 s
内循环试了4种方法,
! x% o q" t i, k1. 直接调用 vector inner_product 247s
9 M7 b2 D& K. q2. vector 循环点乘累加 237s" h- P2 s- J6 i7 O4 ]# ]( {5 m7 i0 X
3. float * 循环点乘累加 204s. L. B, T c( u8 }( _8 X
4. 空循环 100000 次 202s& U1 i5 U3 A/ Q) j% u0 U) U/ l% Q
; A. }. _& ~! O2 z不做内循环 200s/ r' B. c0 _6 L
2 b$ |! f( t& @5 [3 B) f0 Z3 z1 C! ?# F
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
}4 L) l; s" h+ e; `另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
2 P% n9 U. q8 w C j, _$ c
$ b- Q/ b% i" H0 x至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
: P4 c9 I: a2 a+ Y7 P0 `
5 j2 E6 N' k- \+ N(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
% l, n: m1 o# @8 D7 [: r2 c8 r+ G$ c$ D' U; }+ Z1 w
std::vector < float > vec1(N);: Y r" p* y( ]; P
std::vector < float > vec2(N);
. x/ v- T& m5 a' `/ F float* b1 = new float[N];
k' ?, M* D6 ^& M% q float* b2 = new float[N];! C% |* r1 n/ e# o/ m$ d- X" t/ }' J
5 L) d" Z5 b- d4 ?& @1 {
for (int j = 0; j < 6000; j++)% w) n, j3 }! j; a* e0 {
{5 R% w0 e- C% W; \$ e
std::generate(vec1.begin(), vec1.end(), []() {4 N7 Y% X- X( m/ w1 N) j+ j1 I1 R
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
/ \ ^# k. i' s9 L2 @ }); S8 m1 e! g7 y, G, @
9 F: q. j* g3 f" T* a+ r/ G- `+ }6 T
std::generate(vec2.begin(), vec2.end(), []() {
! r, O" ? `3 I7 U, T: {: Z% v return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;) \# l( T+ b* ~
});& M! {1 M8 m) D1 q5 t
j8 n6 |% X7 Q) L0 u6 b for (size_t jj = 0; jj < vec1.size(); jj++)! P/ A; }7 i. Q9 x
{. ~, {* u2 J5 D5 p6 g
b1[jj] = vec1[jj];( n5 r" p( c: [7 n( U( h
}
0 d0 ]0 T+ J- c; N+ b6 O, i/ r1 f
5 C- y( P. d+ F' p) ?* ]5 a$ T, g for (size_t jj = 0; jj < vec2.size(); jj++)
. D) ^. `* C' @) X; L* i) A- w2 Y {7 m# n) j) P% u. l. i3 m7 P x
b2[jj] = vec2[jj];7 r, x/ R% j% F, z' o
}
7 j4 t2 `: q/ ]
0 ~3 N1 x3 H- B' V g //Method - 1 N=100000 247s 9 O+ o) ]& s2 Z
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);0 `7 q+ Z: \* y$ P- t
+ _3 E% L! \4 ?
//Method - 2 N=100000 237s
4 F' ]/ j9 Q* w /*
6 @) o3 L# d4 N7 L v3 `$ o for (int jj = 0; jj < N ; jj++)2 E1 |0 e% f) x9 @5 ~/ J
{" B5 b% u+ {; S: h5 u
fresult += vec1[jj] * vec2[jj];
' d3 A- ]3 I4 u! h+ I& X1 [ }
+ m. Z* k6 N U" [ */5 P3 W. q3 S9 R& Y2 _0 S/ _" [$ Y
$ S- j1 X4 R4 G) o9 d
//Method - 3 N=100000 204s
; I6 ?( V8 u7 U# J7 G3 ]7 y /*% q( f8 U, f. M# F
for (int jj = 0; jj < N; jj++)2 e2 d! N+ ^7 n: \+ u( B1 `
{
' C9 t5 J) u& C' ?, N fresult += b1[jj] * b2[jj];! U: r8 s: f0 \! j- M+ {
}
: S ?9 W$ G p2 Q V */% ^) ]/ j0 s% v7 c c4 l; V( M9 |
4 H9 C) ? t% J, D) q
//Method - 4 202s* x9 J2 V6 [& b! G
/*9 y& s) @0 \: S' B
for (int jj = 0; jj < N; jj++)
- f+ g& s1 q) ?3 J {
' g5 u/ x5 o4 z6 x/ ~6 R$ _ + u3 c/ h3 @2 J0 E4 U( L
}
! {+ y l$ B1 G. {( j4 }7 _7 B9 @: z4 K */$ F U9 J1 h3 y) K% y9 C
//comment out all methods, N=100000 202s
: T! I0 p. m1 U6 {5 z2 Z5 [& f* L' u) E }# O: d% U2 I" `
6 c# J w5 a% a4 E% W delete []b1; w& T) }0 h4 q, S8 O
delete []b2; 3 v+ \( n& `1 d6 H p
|
|