TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 4 R1 q0 S* X' U3 m" M
3 x# K4 ?0 z" j7 B- L理了理思路,重新做了一个测试。, j4 h7 r/ T: P" r, T2 `' N) Z: D
做了两个 vector 和 两个 float *, 都长 100000
1 r% D4 e6 o8 \2 t f# E) M' p& R外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
3 ^6 j2 I4 W: Z- ]6 u$ D3 ~: T+ J1 C* i1 e& t, o
内循环试了4种方法,
g7 c, ~- D9 D/ @& ?0 l1. 直接调用 vector inner_product 247s
& n3 X+ ^) ^9 m2 j! s8 ~" T) S2. vector 循环点乘累加 237s
' _7 F& m0 O6 P7 |! [3 q3. float * 循环点乘累加 204s
3 h; v7 _- f0 _+ J4. 空循环 100000 次 202s8 \" |* N* ~" _0 k
0 i* _4 R8 B( o" P* g8 @) k8 G" v不做内循环 200s
' }& W' H, ]& `4 R2 j/ O; h( ?! [. n( j6 l. h+ ^; C: N
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
1 e |8 t3 U" K8 C- e- M! S; p另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。" Q7 D) b- {/ J+ Q" k
6 k* j" V c5 n, f至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
- w, e/ Q) l/ s% }* {; T8 [$ \5 {8 s$ y8 [! ]! ?: j* g y* @
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
" Y& x) n& N5 X! l. M% a0 E
6 D* z0 t8 G% h7 V/ g std::vector < float > vec1(N);3 t f' t; ]4 y) h* ~& g5 \
std::vector < float > vec2(N);) H, N8 ]0 a7 ?/ J+ J. z
float* b1 = new float[N];0 M% y. K# c( Q) N, f% T
float* b2 = new float[N];4 y- n) F: q: x" L+ v9 x
9 {' f: V) N2 X: U C* E for (int j = 0; j < 6000; j++)4 [% N) O- m5 W5 ^6 D8 d' |
{$ ^0 l n% H7 B
std::generate(vec1.begin(), vec1.end(), []() {
! b. T5 l0 G4 @3 x7 l return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;( H- w8 ?$ c# V7 t1 j. Z# \2 d
});! A$ i4 n2 Y* J4 y% s. H
9 H; ], ]5 q" o5 T% | std::generate(vec2.begin(), vec2.end(), []() {$ k/ C1 F) O4 F" p
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
" `4 `% V- @- B4 h5 ` });5 B% ]) B4 d4 P I
5 ~8 n# J5 i$ b/ b. r+ r' ^
for (size_t jj = 0; jj < vec1.size(); jj++). l) r# l! P" y0 r' Y! J3 o% F% T
{
) W J6 b! Z) q% F+ ` b1[jj] = vec1[jj];
* q8 s' k" ]3 q% q0 G8 k8 F- f8 a }
p9 Z6 V+ K" G" U& {9 H* X4 m t& r
for (size_t jj = 0; jj < vec2.size(); jj++)
4 m1 s9 a" x; H( Z2 X {0 z1 C% f# o$ d7 G. |, S
b2[jj] = vec2[jj];
, K0 f! Q% ?7 Y9 C) Y! T q }
& W; h5 v* n5 a a0 |0 N! X4 d \# e/ f3 `& Z9 e
//Method - 1 N=100000 247s , Q% w {, o0 d3 Z9 z
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
5 l7 V; l1 G# X: ? & H- V# `6 {' [6 Q- u- C3 e7 u
//Method - 2 N=100000 237s* ^( s. S# k( z# b. }: i% l! }( G
/*
8 y: J& m* j! g+ I* k3 k for (int jj = 0; jj < N ; jj++)) V& D( m, W7 C8 Q
{3 M( k1 I" X" k; ]7 x
fresult += vec1[jj] * vec2[jj];
. g9 A% x: O! r; B }
" s5 L! k8 A) P */
9 o: J; g3 p: r8 X
# _ c4 a3 F9 |+ `, f //Method - 3 N=100000 204s" \6 Y! x* v M I9 L& E
/*
- p3 J& s. i0 L4 C! h8 a* ]; L for (int jj = 0; jj < N; jj++)
) y3 t4 B2 C& l2 e {
% ]1 G R/ ^+ x, U fresult += b1[jj] * b2[jj];
. M" O; f% ^3 L3 o0 | }
7 i3 W2 f4 K6 I6 d; J {" g */2 W, r( ^: p- T# m) \+ x- @
8 A" Z* U! K8 }* T2 k //Method - 4 202s
" s2 u- U6 M. K) `& C# F. f /*+ h: ?: `- E( i8 I$ y
for (int jj = 0; jj < N; jj++)/ V) x: ^1 h7 ^; R* {. ^5 [
{
) O7 g, w% ^3 c: i6 {' f9 Z$ l
* z+ V1 K8 M/ o$ P } h5 X& T9 _& Y, a0 S
*/
! A! c: F+ z+ a' ]. }# Q, L7 z //comment out all methods, N=100000 202s 1 z9 u- S7 K' |' ~) X% T y
} l0 C: J' {9 R; ]9 t( e3 k4 k
: U* V. J8 S! t/ \: @7 J
delete []b1;
- E0 s. ~; i; {$ O3 E6 c delete []b2; 4 g* I- l- }7 m# W- j+ u) q, y3 c
|
|