TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 ( t% {3 [1 Y7 x& V
( d/ ^8 j! E+ }4 m
理了理思路,重新做了一个测试。
0 a, S/ D3 R; j' h做了两个 vector 和 两个 float *, 都长 1000006 @4 M7 x5 T6 J+ G. ]
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.9 n4 _; m2 S1 X7 i+ }8 k3 ]! K. h
8 v( \# c& g+ _0 w3 C. {0 {
内循环试了4种方法,
! E, i8 C% D/ X6 u, z6 s1 b# y1. 直接调用 vector inner_product 247s
; _8 x# Y" V, l w% P2. vector 循环点乘累加 237s( E& t2 r; P6 p5 b
3. float * 循环点乘累加 204s! i. R) [0 X$ R6 ~; b, l1 i
4. 空循环 100000 次 202s0 @- h; w9 @7 w8 V+ n( d/ X
6 s4 n/ d W; O! h5 P
不做内循环 200s
; ?- \9 f* K" m, K0 n. _7 G
$ k/ f, Y6 h; o$ x你昨天说的对,内循环本身占比是很小的,大头在其他处理。
- o7 S# U3 ^* m7 u! P/ M另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。: d: j; k+ H% R4 M- D+ W. ?
( z4 P8 X8 o6 K; Z, G- O
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
- Z7 m# H6 H3 I- H6 j
4 H" g7 Z1 Y) t; s& [4 e% o, i7 b: k: u(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
; V" D8 X8 Q7 J. X" t4 t, X$ V
# a; \. b1 }' W std::vector < float > vec1(N);5 L" \# }2 ~( O2 g* S5 H) l+ \
std::vector < float > vec2(N);
* _. C1 }1 \7 r: n9 ?2 I ?6 m0 S float* b1 = new float[N];
6 v- M# _- k+ {8 j. h$ Y$ R( E float* b2 = new float[N];
. R7 t9 S$ B3 x" [
, ^' P1 c8 Q. C( b- y) s for (int j = 0; j < 6000; j++)
- f: ^- a- k$ Y4 }8 k2 I {! h/ X. w& ]- E- u( X0 O
std::generate(vec1.begin(), vec1.end(), []() {$ k1 d) I" C- F# U& E+ ?
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;8 n% v& m4 P0 C3 Q1 O
});
# z' v1 |8 x/ F7 J1 F( v' F1 D5 e" W) Q& G
std::generate(vec2.begin(), vec2.end(), []() {0 ` i9 G" g/ u9 v; |7 ?, M" X( D
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
; h4 t0 t0 J4 ` });; \, R/ C1 [0 z
* T1 I' S8 J$ x9 j6 u, [+ D for (size_t jj = 0; jj < vec1.size(); jj++)) F) \8 E, i2 N# V& F5 M: j
{( l9 C F0 H: }
b1[jj] = vec1[jj];
2 f9 l6 @! P! t- h& y) k8 ^7 O }: \( W, q/ X) d# q
! Z- Y# k- p4 B7 I for (size_t jj = 0; jj < vec2.size(); jj++)' P5 R( a1 g- M- T+ B
{
# K- l ?2 b# o* Q b2[jj] = vec2[jj];
6 \, p5 I4 H1 N. X }
: k' d5 Y# n0 I8 `8 r/ T% O" Q5 t$ b2 w7 s: ^! g+ }0 A
//Method - 1 N=100000 247s
8 v6 g4 q( ]* h x1 j# | //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);6 h2 v3 N. Q) @% }' `. T# T
- k$ M; r8 C, K //Method - 2 N=100000 237s
" V9 T& L, p6 L- a /*
' o( x) [2 k/ a# O2 J0 p3 { for (int jj = 0; jj < N ; jj++)
2 Y" S+ j2 k3 ` K4 i7 \ {
' l5 C& V" J1 f5 P+ s fresult += vec1[jj] * vec2[jj];
O; o) z' t6 Y1 O; A7 u5 ?- L }
- E( }8 V' p$ \& X+ v* e1 I% H4 u */) S9 W$ N% @* x& }
, b, K) _7 O# n+ `5 Y! H M
//Method - 3 N=100000 204s/ r7 C) n3 A6 _# {$ r0 |
/*
1 a9 O# W, b& N" v* L for (int jj = 0; jj < N; jj++). _. g {0 _) w, b4 c k
{! z' s5 B+ @& M5 |/ p5 E
fresult += b1[jj] * b2[jj];
4 p/ [. u' Z7 q: {/ Q" @ }$ r) g: M, W4 S# E
*/, F# s7 h2 o: Q! H% |7 s
( n+ U# i- p' a: n# P8 u: `2 D- ~ //Method - 4 202s) d) b, k! U# Q4 `/ L5 l& e1 J
/*" k1 Y( g2 I# t( S
for (int jj = 0; jj < N; jj++)
4 e9 x! \9 T5 i5 R' I {. x, M$ p2 G9 `- ]
: k6 _5 L4 f- i/ K, J }
& b" D6 h$ B' m' A" l V$ | */
, A* w$ s/ h, T: t' w' Y //comment out all methods, N=100000 202s
, K, ?) f9 N, R }+ x8 b' v; d/ F0 ^/ T+ B; L+ o
; Z* \: j: u% G, O% X delete []b1;
3 T8 c1 V# \+ [8 Z delete []b2;
$ G' W: k6 H( f0 q/ K( S' k% ? |
|