TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
3 F3 Q% p* J8 n( C% ^/ ^: p
- @7 L; `) _0 {) u* }; R. X) b理了理思路,重新做了一个测试。3 b8 Z0 a8 w0 j" H4 ~1 L
做了两个 vector 和 两个 float *, 都长 1000008 _5 ]+ g, N0 S$ P! [
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
! w, D( P1 S4 C* F; r: V. x) [: {/ q! Z, w6 Z H
内循环试了4种方法,8 D8 M U. e; y
1. 直接调用 vector inner_product 247s + \0 @# t3 d* u) N1 ?6 V) ?7 D
2. vector 循环点乘累加 237s; b$ r, D9 P+ C4 A
3. float * 循环点乘累加 204s7 ]+ X! }8 o; q9 e8 Y: Y- C/ G6 `3 h' R
4. 空循环 100000 次 202s
& F5 Z8 f5 z2 K. J& q* t- n( g( i0 d& Y9 z7 J9 ^
不做内循环 200s+ [; b2 t. T% D* w+ C- F5 u
2 A, `" V, y5 u你昨天说的对,内循环本身占比是很小的,大头在其他处理。4 b ^2 K1 Y" z7 R+ }9 G
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
' `: a, N! {+ `! j( t! N. J' C2 {6 S1 z9 }( v% p
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
6 I8 r2 y |. l% [* @$ J
c- n E: |6 P( M(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL), E3 M3 Z# w6 K0 T+ a- `5 Z
5 | b; _. O& F1 g
std::vector < float > vec1(N);
( {: I+ Y U) R" Y) p3 B: R" y# @4 t, p std::vector < float > vec2(N);- C% M+ S$ o! v
float* b1 = new float[N];
X' q% c3 u9 G. w0 }0 x float* b2 = new float[N];
6 u0 h; H* `. M, z
) R- J; a. L/ J# L) [# N- a( h+ P" s for (int j = 0; j < 6000; j++)
3 r+ R r2 W! e* M, K1 l1 E {8 r' ^; @" l# V
std::generate(vec1.begin(), vec1.end(), []() {/ [" Z0 i1 L. p$ ^- l6 p9 K
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;/ ~& v' E+ ~* G& p( B
});& }) C! B" J5 a+ d0 Z# f0 W4 z0 o
8 R) j2 Z# J! k& `
std::generate(vec2.begin(), vec2.end(), []() {5 X1 u- J9 [! o; r
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;& R0 ~ A8 V2 J) c+ n
});
2 t+ r3 n! \2 x0 P6 q# e9 _% c$ n- D9 g8 u7 m
for (size_t jj = 0; jj < vec1.size(); jj++)
" S/ T! G# {: Q) m! ?1 Y2 ~ { o( J/ W0 F7 C0 D
b1[jj] = vec1[jj];" t4 J+ f( X) }- Z& g
}
! h. A0 I S2 z0 r8 `0 W
$ {: t! R. |, D7 e- a9 i for (size_t jj = 0; jj < vec2.size(); jj++)
6 z6 L0 C- E' B {7 p, y& ?( ^$ N0 \1 G/ }- k# o
b2[jj] = vec2[jj];
, W: p |6 C" R! Y- u" {, A }7 `4 G; J& |% y
3 Q% q- D+ a3 E3 f, u( u //Method - 1 N=100000 247s
. a! j: X: s; z1 z3 V //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
1 @4 z h4 T2 d: p: x* T# X 1 E& ?) p6 [/ a7 v
//Method - 2 N=100000 237s0 f/ ^9 ]0 M9 b; `& ~1 T
/* Z* d9 `6 b2 w
for (int jj = 0; jj < N ; jj++)1 \: j, e }0 k. r
{
# p) k# y, E( `( _ fresult += vec1[jj] * vec2[jj];
; T4 e- H' \; I9 }/ q" y }
( g# E' o* @2 l0 L N- ^ */
1 W7 s3 A# a7 q6 K7 U 3 r2 b0 q% e; F" J H9 T3 R0 M* i# b
//Method - 3 N=100000 204s
- k3 f6 T4 g6 `% ?' \4 `+ m! Z3 ~+ M /*
6 a$ C( ^$ ^: _" ~1 B/ m' c for (int jj = 0; jj < N; jj++)
- I5 V* i, h" p J/ b2 G {, o9 S9 S; `& k
fresult += b1[jj] * b2[jj];2 R: \/ s/ L1 W6 w
}
' f" E3 T4 Y0 I) M9 i7 w: G# f3 } *// X; F5 O5 f8 B0 \' d8 s* R! y }
2 l1 h# i9 L! A) J9 K
//Method - 4 202s
. j& \' { ?; d4 o) e/ y' g0 a /*& E: e3 J' G' g$ r
for (int jj = 0; jj < N; jj++)
* f9 v$ K1 M6 A* R6 d i {
/ q1 l" u; Z" E) w, z \ ( l" h" C6 F. M' A. y8 b/ n
}( e. J6 x7 l* j: _7 k r' r
*/% R- u: f$ j w; p3 E+ S4 \8 B2 M
//comment out all methods, N=100000 202s 4 F5 o7 E2 S( U2 K
}5 e& C8 E, @8 @3 P. }* ^) F9 A
6 t) F# R+ j5 n, f
delete []b1;
& \* _9 w/ F+ d! n' V0 l delete []b2; , d7 D; X0 l+ s; t( Y3 J
|
|