TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
+ g8 d4 B+ j* k" ~# ~) n+ D# e2 \7 d( g0 z) i
理了理思路,重新做了一个测试。! D5 M' | A: M
做了两个 vector 和 两个 float *, 都长 100000- t) U; `9 f1 |6 |: C1 m& B6 E
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
; D* _& J7 P9 }- L. u/ Q
. h2 }% n i. A$ a0 r内循环试了4种方法,* v) g0 s8 m$ Y9 J& E) P
1. 直接调用 vector inner_product 247s 5 Z2 P7 b3 c6 C* d4 f+ }0 K
2. vector 循环点乘累加 237s7 t& a: k# G# G% y
3. float * 循环点乘累加 204s3 v/ m* k5 f* q& r
4. 空循环 100000 次 202s! ~6 {* M$ l' ?8 p; `
4 {6 @7 E' M+ w! r5 o不做内循环 200s
7 z, \4 K. q" r n1 q- N% l- Y e2 _ M. _5 `+ ?- S
你昨天说的对,内循环本身占比是很小的,大头在其他处理。$ e' m1 @2 k4 `4 z P
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。& K. t7 t; j! ^- s% _
' h* m% w0 i, m$ ?8 g至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
4 w1 e2 R' q" F7 A. q
@2 R6 _ Q/ C2 x1 c6 R$ p. q(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
3 y, q8 q4 j& h* P9 r3 `0 O8 G" S/ s6 s% t
std::vector < float > vec1(N);
( {' V4 q! d2 g std::vector < float > vec2(N);2 U* D& ]. q- r5 ~2 w6 |
float* b1 = new float[N];
# {: p0 A( |; L float* b2 = new float[N];
: \9 z& a+ h5 m" Q; T; A; A+ l; O. f
for (int j = 0; j < 6000; j++)4 m6 Y: y& w1 [; R) f8 K( u( a
{) P d% A+ y% z1 B# Y
std::generate(vec1.begin(), vec1.end(), []() {2 E( X6 W8 [: f
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;4 J# ~( d" s* z1 a& Y. G; w( A
});
4 v& h( ~. C d9 q" b' F1 N4 Y
* b7 S! m- ]' N: ~, M0 Y: [8 } std::generate(vec2.begin(), vec2.end(), []() {0 W$ n8 i: i: i8 |; Z& i8 C; B
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;$ ?; d! z; J6 r" |- g
});
% F9 T# ~4 ^: q. L+ P( l+ o: X% L5 `- j3 d# r2 L3 c& J
for (size_t jj = 0; jj < vec1.size(); jj++)7 Y# b5 y1 r: r1 c- j
{
- A( E1 ?0 Y* N6 b- r b1[jj] = vec1[jj];
5 ^: e' c: W/ u" r! \" e }
3 ?: r+ O5 G5 d6 u+ P3 \! G$ O3 k$ g7 C& H
for (size_t jj = 0; jj < vec2.size(); jj++)
6 j9 f/ s3 d3 i4 O {( J# }0 z! Y8 _# d& E, u r
b2[jj] = vec2[jj];/ A4 i3 K: {& D f0 s7 M3 T
}5 m1 m7 Z, L4 P) o' W" R7 \
5 y; b! j9 r$ [% h //Method - 1 N=100000 247s ) K2 e; x% Y* i8 v9 y2 V; `# K
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
- U& \; J' j' L( |" b
$ |/ F {. ^( y- r5 ^ //Method - 2 N=100000 237s
3 x x U+ n4 S2 C& N# E0 C /*5 ]: P3 E6 i* |# o) a2 g0 \% a
for (int jj = 0; jj < N ; jj++)
0 s$ ^6 R# t) o8 O. z2 e {2 E& X8 s' s" [6 M3 i
fresult += vec1[jj] * vec2[jj];
, \) r& o9 D& ]* y) X }
& Y. q+ t+ H) U0 P */
( C- ~) x$ F( M L z! b4 R0 t3 B
//Method - 3 N=100000 204s
- f" `8 o) B2 l3 ~0 _( S. w) s) D /*
& S% c9 B) q4 G) @. p for (int jj = 0; jj < N; jj++)2 [ Y# }& ]6 o0 z
{: i0 E) w g; U, _) l. ]/ r
fresult += b1[jj] * b2[jj];' c9 z( C! _' v, o. x& S) _
}
# r8 {9 N! w' o: k u9 W1 Q */% L" Q4 Q3 `7 a# f
$ G" S7 _! \; K, K3 Z. }7 x9 H7 y2 T
//Method - 4 202s
. N- i! P0 Z5 S. X /*1 u/ U' p& ^2 K1 C+ e! L$ I0 B
for (int jj = 0; jj < N; jj++)9 B& J8 U4 I0 _* @# J
{6 _4 ~" J4 l F% F& v
7 m5 Z6 k. b! K* G# a! f6 J }
# r6 s- O; p! X# i2 U* m' U */
, T6 c8 I# G; ^8 R //comment out all methods, N=100000 202s 4 _/ ?# W7 |& C+ }& ^$ d
}& ^. w6 H. H, Q
; D; e1 B; K9 s/ C; d delete []b1;
$ e1 R- `: z( V( X+ a b delete []b2; & s( N* g1 |! u- M
|
|