TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 * h* y) B) {! k
( J) y; y# Q* y
理了理思路,重新做了一个测试。
& M/ d" X, w8 y6 @9 u; S做了两个 vector 和 两个 float *, 都长 100000! |8 d4 F& M/ G7 a2 h. b4 P
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
9 ]; S1 d6 I0 o4 S) B- t! n5 s& }: y0 E: p* G N8 `# C+ ]
内循环试了4种方法,8 p+ W+ @7 M8 C; \1 D6 ^; L
1. 直接调用 vector inner_product 247s
, A4 h4 h. a# O( `! R* F3 U9 a, [2. vector 循环点乘累加 237s
. `0 U* L0 a5 A, R- v: J3. float * 循环点乘累加 204s6 _- ]# G4 w& H- z1 ~# r
4. 空循环 100000 次 202s
1 I0 {/ u$ T8 b: r0 W0 D/ o( H, H$ s( s+ G# A! `3 S
不做内循环 200s
# w& m5 `. Z: V1 [9 U9 y& u6 ^9 G3 i% O- l% [5 h# e0 G
你昨天说的对,内循环本身占比是很小的,大头在其他处理。! e% t& c' N7 k1 [4 m
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。0 X7 O6 f6 C h6 ]6 F# n: F& Q
. i9 |! h2 s0 D( g4 F
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)/ l& m) x0 U! c7 g- z9 e! I
' G6 ~/ R% A- E8 E. m1 y$ x(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
2 }7 R: w4 K1 y' N# @; |% T7 P" I: w9 P- B1 [$ I
std::vector < float > vec1(N);" V% U( }- [: Z3 B% k/ y
std::vector < float > vec2(N);* `! r- m" w1 g$ n9 ]* o% N
float* b1 = new float[N];% _6 J6 a" d/ M- Q
float* b2 = new float[N];
2 _, e* D; Q A. q5 r/ _5 F% N% ?1 {5 Y
for (int j = 0; j < 6000; j++)/ c, J. Q. f3 u5 R1 k0 @9 T9 P
{& f, I$ f d4 [- X& D8 e2 ?
std::generate(vec1.begin(), vec1.end(), []() {
- l/ ~9 R* w1 O: }2 y9 {1 a; x return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;' Z4 w# w1 I& `; s! }2 R3 K
});% C# U& o: Z( R: J
" S, y2 b7 T( Q) q( d
std::generate(vec2.begin(), vec2.end(), []() {" y* X1 M- V& e+ x0 i0 H
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
0 O0 O& G6 Q% {1 l });
' ?0 D3 r5 ~4 d' v$ I8 ~( d8 t2 I) Y
for (size_t jj = 0; jj < vec1.size(); jj++), W9 u( x; w& z( O+ l6 Z9 X6 w
{
, s6 @2 i5 V/ n I' e b1[jj] = vec1[jj];' c4 T4 ]4 X1 @0 Z8 z
}! c* p3 j2 o8 L; g
; }3 t* K/ [' a \8 ]% S
for (size_t jj = 0; jj < vec2.size(); jj++)
! X/ k3 F! |2 ^. ^( f Y* ^ c8 Q2 }5 A {) X# f3 ]/ b h6 Z' q2 o
b2[jj] = vec2[jj];1 R) s4 F7 d# ` d* Z# Z" { |; I
}, H0 d# y$ g9 D2 ~# \7 r% i
1 q' r, O! ^/ w. D //Method - 1 N=100000 247s 1 v0 z" c1 x# m& C) v
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);7 y" @7 q; b5 c( f1 g: s4 A' b
+ o) \) f% v; _3 E" h5 w
//Method - 2 N=100000 237s
2 S( `; _8 d) K6 d! k' M* W /*
; `7 m3 R% d" x9 W7 F7 S5 L for (int jj = 0; jj < N ; jj++)
1 T3 y |8 @* f( B {
5 t* s P- X' T0 k fresult += vec1[jj] * vec2[jj];
! u" \2 {$ y* i! Q+ |! G }
$ w, v. z6 Z$ p0 K/ K */4 D" M! d% r; @+ J6 o* c; H0 u/ ~+ T
1 W( J/ Z& v! j+ D //Method - 3 N=100000 204s
% ?2 q- n/ F( G' R+ e+ M /*
* j; z. Y; R$ } for (int jj = 0; jj < N; jj++)
) Q3 ^; ]5 L# S }1 b4 r; G; ] {5 O- F1 ~7 P$ a+ e3 d
fresult += b1[jj] * b2[jj];
1 h( o. j2 V& b7 c7 o3 B$ |. p" q% Q }
/ |& `" R6 ~) q* H3 r; G$ P+ C */
- y$ Z) v( D; }. W3 O' n- e2 |3 M
2 ^% r, r3 p/ ? //Method - 4 202s
- c+ d1 }! @" d1 Q /*
6 g2 d7 O( y* Y8 N for (int jj = 0; jj < N; jj++)) O7 q6 m3 ~3 o: |& W
{$ M3 T* U/ C9 N4 l. U" I2 F8 M
/ k9 u' d; V$ X4 b2 C# j% O
}
6 ?% G6 n [. J( X */
" h+ t4 b9 b) H& N- |+ u9 o //comment out all methods, N=100000 202s ' n5 |" q! T5 F7 B ]0 ?
}2 I4 U4 H* {% F+ p6 r# z4 z/ I
$ Y& U; w5 R: M7 w& I/ `
delete []b1;( e( z6 P0 K4 t6 G; Z' Y9 O
delete []b2;
( }8 {4 ^+ A" ? |
|