TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
, N' i2 l: P+ h* {7 T0 H! K+ u% G: p
理了理思路,重新做了一个测试。
, E% B4 o, m4 \0 A- M/ }# I% W2 h做了两个 vector 和 两个 float *, 都长 1000009 I- l% S8 [$ o5 J3 M! m
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
+ X( c) b1 ?1 X- F* P: A. D$ O5 h, ~. \4 o8 \
内循环试了4种方法,3 {: h6 s V; f0 z j
1. 直接调用 vector inner_product 247s
0 E% q6 I+ @0 ~4 K. F; a, \0 Q, W2. vector 循环点乘累加 237s9 m* N2 \: I! W' Q4 S4 s: W2 M2 S
3. float * 循环点乘累加 204s( t0 h/ ?* y' m) e7 `/ `
4. 空循环 100000 次 202s( H( l$ K6 i5 c
4 K- m) h) E$ ?# h9 p不做内循环 200s
& M2 }) f: K, w6 X" `6 n! x) O# i) V& D( _" {& r
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
6 g- \6 K5 t' c9 S, m另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。0 P1 b7 j2 V" U$ {+ g: W
+ g0 r0 ` o2 p) v8 Y* }3 D- s
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)0 B: q4 z9 K2 n3 s$ Y
9 p# P- M F5 j3 Q; n4 Y(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
) E) T7 E+ J, j# _# a8 e1 i& F5 y* U5 ?/ Y
std::vector < float > vec1(N);
( b7 O. R" [# ~/ d$ b3 t1 k0 Q std::vector < float > vec2(N);
5 u3 V3 o% S7 w" i) u0 S( J float* b1 = new float[N];
5 j2 i" X& g0 f1 Z float* b2 = new float[N];1 D5 O4 J3 }- k7 b
\, c& u/ D/ q* E
for (int j = 0; j < 6000; j++)1 i& R" u& G2 l5 `1 ]& E: V
{( S/ M7 d2 C9 s9 s; k# I" @9 _
std::generate(vec1.begin(), vec1.end(), []() {/ e! G9 g4 f% ^' I3 T
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;5 s; D7 g1 r% z) H- N
});
. U# C9 |8 i% D J7 C
5 t9 |* M! `5 z! x, ^ std::generate(vec2.begin(), vec2.end(), []() {
1 |0 \6 `$ [; D return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
3 v& m+ K- X; }% F });8 S& ^7 l8 R- y2 ?% k* }1 S
+ O$ G: Z4 ^6 D3 R1 D# N: S
for (size_t jj = 0; jj < vec1.size(); jj++)- p9 f% ^7 r1 i$ e: q8 }" n
{
: T: e% Y5 Q3 [, b8 L b1[jj] = vec1[jj];& _3 Z7 ` O: z; M
}2 g& C+ h0 O6 a5 Y+ D; w
9 F" t% Y8 N5 |/ G6 ^* H/ _
for (size_t jj = 0; jj < vec2.size(); jj++)' x/ T+ ? Y+ U
{
$ ^; w* d/ S6 f8 s4 i' v b2[jj] = vec2[jj];
1 l: H8 x: T% u8 T1 `( Q }; p" q7 I- g( C4 T: ^: E' {. ]
; [9 X6 Y9 N7 H9 V: [ //Method - 1 N=100000 247s 4 L; w" X9 G) h( a8 O+ x% E) p
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);4 E; A: |7 P4 Q* h6 p8 p
8 |' ^# F, L$ z: B- h8 B, z5 S //Method - 2 N=100000 237s
9 k6 R# h+ S' F /*
/ f, O# }5 A" r" ] for (int jj = 0; jj < N ; jj++)" w# r3 k3 i$ l( w' c- R& w
{6 {% U1 v* ?1 T) \) a2 H
fresult += vec1[jj] * vec2[jj];
/ {1 ^: _, b4 Y& X$ l6 J }
4 w0 R- R: P& w! Z, C) h */
# U: I2 T. m6 B8 ~) x
" P" T: j3 }8 I F" Z. ~ //Method - 3 N=100000 204s
( D; d7 _6 F* ` /*$ R7 C& B: e, f; }, j+ Y5 g4 m( a. o
for (int jj = 0; jj < N; jj++)8 h+ t+ l/ ~$ {6 R0 f4 C
{
6 P ^; Z2 U; B- U" m- f) B0 n fresult += b1[jj] * b2[jj];' u+ P8 n% A1 ^* r$ U( N
}
0 s0 y% @& f8 ~$ v, ]6 J" ] */
, m3 v0 H7 p3 e. E# z) U& |* ? s" x
//Method - 4 202s' D! b1 s# j0 l) L" R3 s9 X
/*' A8 E* D. U, j7 ?5 B4 }
for (int jj = 0; jj < N; jj++)
/ d, Y5 S* J+ j' d# W4 Y, S {' z8 K7 Y# N% P" R$ v, A. C
4 F8 X, q* I/ f& Q" _ }' @9 s3 g( t3 ^* @# q
*/; r- o4 I: U. R
//comment out all methods, N=100000 202s 7 D$ G5 A9 s7 u& {: K
}
( s, \+ A2 H7 f5 ~0 ?8 U
6 X# W0 ~! ]) l/ i X delete []b1;* W+ W, ^$ g4 J8 F6 s
delete []b2; # N5 S4 l+ B; F: L1 M9 m
|
|