TA的每日心情![](source/plugin/dsu_paulsign/img/emot/fd.gif) | 奋斗 2024-3-29 05:09 |
---|
签到天数: 1180 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
: P O' g; o0 d, V2 N% T' S7 w$ Q7 {7 A( O$ h5 a
理了理思路,重新做了一个测试。/ |$ q) r9 R0 f( B3 o" {8 B J
做了两个 vector 和 两个 float *, 都长 100000. X$ X+ H4 K# Q& u6 o) a6 h9 F
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
$ a# m( d- }3 w; b
& |$ R$ H# C7 x! w) h: m" j! m4 K内循环试了4种方法,+ {4 r* J: C; D
1. 直接调用 vector inner_product 247s
2 d$ @" v! ]5 y' H9 Q' ~2. vector 循环点乘累加 237s- n0 O8 A% U/ T4 d2 k) A5 ~
3. float * 循环点乘累加 204s( m; w) M& r5 H, H2 Z
4. 空循环 100000 次 202s
) w* O0 A7 z' P4 Z& w! U. H" `: @4 E: e1 {+ x5 O+ X$ p
不做内循环 200s" d1 @1 |! O5 g; t0 W
6 q, V. z# v" l你昨天说的对,内循环本身占比是很小的,大头在其他处理。6 d5 r) w! N( j0 A' l/ k
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。! C+ e% r$ V1 t
! w. j3 E5 q4 u3 {! ^8 M" `
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
1 s( @" [$ A; {) L8 |/ _3 s' s; s' l
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
7 \/ e: D5 d; n& X1 s( e' U: p5 ]8 `6 o: Y
std::vector < float > vec1(N);
( P" e4 m) x: O) w/ s std::vector < float > vec2(N);
" E( X. }! @% w. i6 s' M float* b1 = new float[N];+ _# s6 K5 O* i& [
float* b2 = new float[N];
" o# O1 B% k9 Q* T
0 J6 l' R R2 w. B, i6 V for (int j = 0; j < 6000; j++)
( C1 Z. X; j( ` {
/ t/ m3 W2 c; S! d. d1 k8 N std::generate(vec1.begin(), vec1.end(), []() {
% H$ A: B* b+ n; P return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;4 T. }: o4 [' y# L( D4 T
});
9 s+ }/ {* i9 Q' G0 z7 ?) v/ V$ q! ?) w$ ?# |) J8 u
std::generate(vec2.begin(), vec2.end(), []() {
6 f' o+ h, _' q+ e return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
9 O G9 w8 I b3 g });
+ `8 u) J6 a* x7 _/ J) i9 Z2 T# w4 i* C' j$ W% Y% R
for (size_t jj = 0; jj < vec1.size(); jj++)
) [% I* b! t# @ {
1 j1 _4 ?. F& r2 c: t. T b1[jj] = vec1[jj];
+ s0 A# o/ g9 ~) m' c }- j( A) N/ l9 F4 r" p! ^' X
: B" |5 _- M) N! u# E
for (size_t jj = 0; jj < vec2.size(); jj++)
3 L% b, f+ e4 L {
* H. ]# L$ N! s0 j b2[jj] = vec2[jj];
* I2 P- a' n/ W( L7 e4 l: E: b. c }
# t6 J p; f- a- Y j
! b8 \3 y n$ U5 B; l9 `8 i //Method - 1 N=100000 247s ' @4 W" n/ e3 X5 E4 v
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
; {9 S% t$ f. j+ i6 V* _3 `
3 Z2 a' m% t* f* G. o //Method - 2 N=100000 237s
# S4 d+ }% l* _ /*1 _, K7 g: d1 N3 \1 V
for (int jj = 0; jj < N ; jj++)3 g& F: a9 Z8 o6 l/ y' |- y, P
{
5 ^) x) ~7 ]( D! N8 e3 s A4 P fresult += vec1[jj] * vec2[jj];' }4 |. C) {( w1 V; Q" u
}! R( H5 F9 U% ^' t m
*/+ e. l+ N; N: P
1 }7 t$ g9 m1 p1 h& f //Method - 3 N=100000 204s. P. }) j3 Y$ Z) m7 U, ~% Y
/*
& z& m+ t* G- _! O: P, X) [ for (int jj = 0; jj < N; jj++)& z+ a2 K! f H5 z y( N0 Z
{
3 [# ]. @/ F9 z0 u% z, `: N fresult += b1[jj] * b2[jj];
- k6 Y. t! {! H" O }
- Y3 x8 L6 x8 o5 ^, I; h2 t( ~7 W */
8 A9 X& u8 q1 U4 I
1 z8 m ]% i! i3 j' e' N7 u //Method - 4 202s
, n/ R$ g0 ~8 W% m /*# ^0 o! j6 B) e. H8 s
for (int jj = 0; jj < N; jj++)
* c+ o% W/ X5 x6 A. d1 i5 t, {" p {" {* L& z, x$ X. g+ n
! B. B# o+ m; Y+ ?* o; o }) d, L( o. y% [; o2 f) \7 K
*// a$ q- e& L& r+ w
//comment out all methods, N=100000 202s 6 q* C6 H4 I8 I- M
}
" ?4 k0 U0 i$ \1 l5 p& y6 ^. f
/ r0 N( i# E! k5 ?! q; f$ f+ a% t8 T delete []b1;- o9 d: v$ q+ z8 ^6 L
delete []b2; ! N3 X! ^/ {! K, j3 Q0 S5 z! ~
|
|