TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 ! |# H+ i, b5 }7 f. v1 O1 R1 f
- w% q/ Z: w. x2 ^7 b4 O, G& l# d l理了理思路,重新做了一个测试。$ Y5 x& O1 }+ J+ x0 y/ n. S
做了两个 vector 和 两个 float *, 都长 100000
/ m3 o, j4 Q* u! ~/ o9 }! N外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
t( t2 i" u- @4 T0 J$ i; n, A% s# D3 d2 }
内循环试了4种方法,
/ M* t/ }! u5 t. \1. 直接调用 vector inner_product 247s 8 H: j5 M q2 \5 ]3 G
2. vector 循环点乘累加 237s
& b O) U! S* @) d. y3. float * 循环点乘累加 204s/ u. J% s z6 X4 B% O5 ?
4. 空循环 100000 次 202s
; c9 Q# J" `% B& m' }, Z6 s3 B- L' [3 a( I) h7 r5 t, p! X( m
不做内循环 200s
4 J, X* |5 }& X! ^+ F% x$ k" R, Y8 P4 T7 g5 D
你昨天说的对,内循环本身占比是很小的,大头在其他处理。* q5 o$ M( x( }* X/ I
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。" w/ e. k& ?* U4 S# _# b
. T' D% U9 \" [9 z, _) `& x+ D
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)& ~5 O; E- P# l A, r N
5 y! |0 Y |; P2 |" \7 r1 q(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)" H4 Q; ^# U9 }
. H- p: ?. y' {1 z
std::vector < float > vec1(N);" d ~; S9 j& Y) v
std::vector < float > vec2(N);
* J# P+ ?9 F$ H6 v7 H float* b1 = new float[N];
/ _9 V( |' R0 N E% B6 o4 C float* b2 = new float[N];
0 \* S0 a8 l/ u8 H5 J Y* a( z0 S" B
3 s$ Y' N' e$ _3 a. M( k4 ^1 j for (int j = 0; j < 6000; j++) a. J& c8 B9 O9 H" s
{7 L# C, k7 I& @) n
std::generate(vec1.begin(), vec1.end(), []() {" ?, W4 z3 \3 Q4 W1 G |
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;) l3 g; P; R" c3 }
});2 g& R: W& C6 O% [9 X7 I
6 U2 r) @+ l0 \8 n std::generate(vec2.begin(), vec2.end(), []() {% A6 K) Y5 C) H4 V
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
5 X+ L, Q7 y4 t9 d! X });( K. l" I4 I3 z2 G$ t$ W' l1 L
4 q# t5 I1 O4 W2 S( V; d% f for (size_t jj = 0; jj < vec1.size(); jj++)5 L/ f- K; ^0 G
{
2 Z2 @: M! `8 h7 I1 W6 f8 B b1[jj] = vec1[jj];' t5 A* [* m2 `. S2 X
}& Z0 i6 A' D$ s7 s% j% o8 M; M
- `* l5 M8 M# R5 U9 W6 A
for (size_t jj = 0; jj < vec2.size(); jj++)- v/ A3 O, F( ]8 J1 B/ T
{1 ` K1 \$ M: g" Q3 u: Q4 ~# H+ e
b2[jj] = vec2[jj];. H) z" G# I& P) O9 `* ?
}/ a# ?2 F9 _, F+ _% x: }
$ i2 n! F0 z- K& p1 d9 X) F' ` //Method - 1 N=100000 247s A& J# K/ u, x4 s- J$ `/ h
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
$ F$ I0 B m' q% s5 }5 B' t- ~! c # s% h7 p x R! d, {5 j+ U
//Method - 2 N=100000 237s
$ g+ M1 L( k+ ~4 R /*
9 D0 W7 a$ |( q for (int jj = 0; jj < N ; jj++)- _1 A/ n2 r# C1 W" f2 W
{0 D1 Y5 E4 s! D4 Z1 s
fresult += vec1[jj] * vec2[jj];
9 v' A3 ]& v7 O( l9 j1 \ }: F& h# y# }8 H. T
*/
& y2 o& m* [( ]- p2 a; [! L
* `% Y% R8 [0 X' K6 z# t$ C8 N5 F //Method - 3 N=100000 204s0 j) y9 T. R5 i& P/ A, y+ p
/*1 [/ S1 U" E/ {/ S0 u
for (int jj = 0; jj < N; jj++)
! P* Z; G3 w( e; Z3 j2 j {0 C- |0 a; V$ x7 o1 @2 Y* r
fresult += b1[jj] * b2[jj];5 o4 a" m7 U2 r0 @' s8 x9 D
}) p- ?+ b0 x H3 Z/ e; e
*/- I, Y! a3 Y: W4 Y* j
, g! }+ t) q s
//Method - 4 202s' S6 t* P7 l2 j4 {
/*
- K0 K) E' v4 E3 j for (int jj = 0; jj < N; jj++)
8 ^ e6 ^9 }& h g+ g+ j" b# C! W3 | {9 {" g, z' ~ V" E
# c: G f( @) T5 s }
+ u4 b+ x# O9 `3 S */" T. k9 `( u0 E* J
//comment out all methods, N=100000 202s
7 d/ n U( ~/ l' V( p }& B# _, f q, K' n
+ \6 \1 a; W& H delete []b1;+ j6 w/ E$ t* ?% N5 H& S2 u
delete []b2; , e& l* G& e& b; E5 Y
|
|