TA的每日心情 | 擦汗 2024-9-2 21:30 |
---|
签到天数: 1181 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
' k5 o: f, d' \" y
( q( { v" S1 m: ~7 S理了理思路,重新做了一个测试。' h! i0 X* i/ l" i v
做了两个 vector 和 两个 float *, 都长 100000
- v/ n1 w$ ]1 s外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.0 _( o' Q1 O$ m, R; Q& e
$ H3 }* f2 u8 `- w# u) i
内循环试了4种方法,9 P; B; F! \& X; [$ g& G0 z7 s* `2 O
1. 直接调用 vector inner_product 247s ) F; S: S8 a; A# Z1 k
2. vector 循环点乘累加 237s& ?) [6 @3 x7 y% `/ ~
3. float * 循环点乘累加 204s0 Q2 W" j5 B* i
4. 空循环 100000 次 202s
+ D7 }* b" i/ j4 I: {6 n3 u* l% _& E
不做内循环 200s
9 A R i# p5 [" m! {# k f% A0 z2 S, S L2 c
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
9 `' _5 e9 p$ C; M- h5 N8 ?$ [1 v另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。1 w) l/ `1 L( I6 k
% a) G* F; k% i; k2 [至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)) J ~. f% t5 Q$ ~
6 j8 z" z0 ~8 z E6 V5 {( E(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)& F7 {- J: f; P9 x( Q
4 @$ H* C& Z7 t) r, }7 H
std::vector < float > vec1(N);) D+ t* Q( A9 w9 j0 U$ v" G+ P
std::vector < float > vec2(N); c1 B* p2 h) a" q/ s; g" `* u
float* b1 = new float[N];
$ X! H+ |7 n( \) e float* b2 = new float[N];
" e0 g) y( O2 S0 z% g
! n4 [1 t8 ]& ` q* i& u4 h! { for (int j = 0; j < 6000; j++)5 Z- a1 p) x7 ^/ V
{
8 c& z2 y, k& z" X3 W) I) A std::generate(vec1.begin(), vec1.end(), []() {
& ]* w7 t. U/ C8 z5 x' O r( D% } return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
4 Z6 A( \. a/ i+ o: f3 @; w8 @ });
& l$ N2 a1 z r8 \! c( I0 R! x
1 `, \$ g ~& N$ w4 h" P% T std::generate(vec2.begin(), vec2.end(), []() {2 z! l3 c" l1 e" r+ V' }1 P0 p
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;) T$ s2 [; R8 ?% J$ R
});
* S3 R1 Z7 e/ D) k/ G/ w. [0 }+ N7 c' y3 Y. S- _0 u
for (size_t jj = 0; jj < vec1.size(); jj++)) I" \$ w( ^- f
{
/ S% z# R1 R5 z$ ]0 x/ Y' u b1[jj] = vec1[jj]; \* A1 J) R" s& _3 W! g0 u5 d
}9 |, q8 A8 r* j) m$ |
; K( K8 ]- [ C6 s* G
for (size_t jj = 0; jj < vec2.size(); jj++)6 H$ _7 v" A$ S1 {4 k, N. p
{
1 T! A; u' l# O* u( b b2[jj] = vec2[jj];
& a$ }. L8 h0 f5 i% f+ L1 g! _" K }6 _ H o: i5 z% i' _7 m: v
, c1 P8 g( e: F b
//Method - 1 N=100000 247s , J1 A T+ l; \- ?$ ~7 x9 J* N3 B
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
1 i- e O7 J" h c2 B; L
* i! f- @, \+ F1 |) @3 J" j5 R //Method - 2 N=100000 237s+ W: ^* g4 y2 t1 L: m$ \3 Q0 C5 _, @
/*. f. `0 ]3 n- g( ?4 k
for (int jj = 0; jj < N ; jj++)
3 Z- X7 R* v3 h/ W+ e! ~ {
4 A5 I$ B" r$ d' V fresult += vec1[jj] * vec2[jj];
3 [5 D6 ^6 `+ @2 o7 I }
8 h8 h: t8 L9 ^' j5 V, ~ */, |* `1 T, ^' e# s+ H" [
0 x5 K4 t- ]( \2 f
//Method - 3 N=100000 204s
8 |4 @! ]' s* W: }% _( O t5 ^) U* i /*
# e# u! e8 T' P) d, ~ for (int jj = 0; jj < N; jj++)8 ]1 e# y% Q: {9 H7 f, R! S
{! V- H4 n3 P5 m0 c
fresult += b1[jj] * b2[jj];* A$ L2 F4 ~$ |3 ?
}
+ f& N, y( U* M* |5 @! o */8 t$ c( M9 I8 J* r0 a+ q
1 l( I' l2 `+ y9 V
//Method - 4 202s4 S* {, u) Y7 W, y2 \! i
/*
3 G6 n3 x. N) Y' ?! O7 j6 ~ for (int jj = 0; jj < N; jj++)
6 Y; J. b2 S* B2 I j- {, Z3 J {" g }- U' M; `$ H
: H' b: _+ l- P( _2 j }
! H- z7 [ C' ]: o */4 }2 |$ R, S9 L
//comment out all methods, N=100000 202s ; c3 h9 k0 @( Z$ u$ Z
}% l1 g$ @0 j# s8 ~2 e U- h6 |
# E# n9 b3 l& H @7 {* M) E' h( m delete []b1;
1 i" V3 k2 u- i2 O. n delete []b2; ; P, T7 \/ p3 u% l4 \0 @
|
|