TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 $ \2 [4 G/ I2 ^4 x
; o3 B4 D: u& o. N' V( l理了理思路,重新做了一个测试。# y* d4 ~$ }7 W& Z- r* Z8 w
做了两个 vector 和 两个 float *, 都长 1000000 K5 L' I: W7 o( z% i
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
" v) i1 Z: w' t9 Z
. j: ]2 g! I! b: c* H% a" j/ X内循环试了4种方法,
{, O5 s& V0 Q/ r1. 直接调用 vector inner_product 247s
% g6 [, q' R" R% o/ }2. vector 循环点乘累加 237s
, t; \* ^9 ^, L- \4 y% \3. float * 循环点乘累加 204s3 N' v/ Z8 x3 l1 v
4. 空循环 100000 次 202s
4 a6 a, a& Y7 O; o, M |5 J
+ u( ?( e& B# y8 y不做内循环 200s
/ \. h- {, N6 Y' o2 @. M b2 B3 ]* D9 B* l
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
5 ?0 x" S0 B& g, |" Q4 R7 `; |另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。# m$ b) x, c; r
+ o, }. X$ w; o3 Y3 r
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)2 `6 V2 R& g/ s' r8 F1 k" N
3 T3 A4 E: V. n4 s- A5 s0 l$ A4 S(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)/ s: N) g7 Q( p4 Z" ?. }" f
! K: J" W% `7 @
std::vector < float > vec1(N);; Y& c. k5 f' U( | V, h' @% K
std::vector < float > vec2(N);
j, q3 w6 Y" P' I# ~5 N6 } float* b1 = new float[N];. x4 z4 y0 J* ?
float* b2 = new float[N];
( n* p( J2 _ p' b- o6 H: [
! p6 t: r9 [, h+ l7 v for (int j = 0; j < 6000; j++)
. k9 }9 u- I H. L$ S3 q ?* i8 h+ K {
1 t- W% O7 T: [ std::generate(vec1.begin(), vec1.end(), []() { d$ S4 B/ F' l1 u3 h& m
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));; N" F/ n( l2 R# w S) W
});2 r7 K8 v5 n2 O
! u6 `3 P3 j& P: F
std::generate(vec2.begin(), vec2.end(), []() {
5 w8 X; v: ]; f4 ^# Q+ S( | return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;- u% p- v8 j5 \5 G
});2 N% R8 B8 n$ C
% b6 [$ W! b2 o+ _
for (size_t jj = 0; jj < vec1.size(); jj++)
5 C# {4 w( ]- G: _ {
7 }& H2 l6 [" H) q' n b1[jj] = vec1[jj];
1 ^) z2 B" w2 P L }
& z+ x' a ^2 m. y' T2 v f/ B' f
- y& K2 _) w7 K. C, J for (size_t jj = 0; jj < vec2.size(); jj++)( @3 h8 s7 r/ ~9 T6 a
{: x9 m2 S/ W! [ n v: b
b2[jj] = vec2[jj];0 u Q. r: I! D! V* A
}5 q( S+ t5 E# D* k5 A# f
$ O& W' u2 V0 ]( r, ~ //Method - 1 N=100000 247s 6 Y* t; }- m F2 k4 u
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
/ S( Q* M3 p8 S7 n7 y
, Y$ x! `% {0 m% j0 } //Method - 2 N=100000 237s, g# Z/ h0 n2 y+ O
/* i$ e, @8 ?! ?; g4 m$ k. H% \
for (int jj = 0; jj < N ; jj++)
% t9 H0 B* \; I; |1 W {
% [ U; u9 Q5 j$ z6 p" H6 V fresult += vec1[jj] * vec2[jj];
0 e( I: r4 g- q }& y6 ?* z( I- V$ x
*/3 ]4 Y1 g* d- L% `% f: x
0 q/ g Q2 X9 F# {
//Method - 3 N=100000 204s- G7 B! l: k8 f7 O
/*
' v( c% X# p$ l; f# J/ d for (int jj = 0; jj < N; jj++)
6 t, v: `2 I6 w# U& y. W {/ n1 m g) t+ J/ X4 C8 t6 ~ l
fresult += b1[jj] * b2[jj];
8 c2 a/ x2 ?9 @7 i# \+ F }% P% q) j3 A& e5 \& t S6 P, Y9 B
*/
' P1 z; x& b- f7 y( ?; K4 K R9 O/ v" B
//Method - 4 202s4 l* L+ e3 n6 r7 \
/*
$ t5 r9 k: ^, v h for (int jj = 0; jj < N; jj++)
9 W+ B4 l7 L5 ]2 C0 C {
$ T l6 i# w6 B. j4 z& x% q9 ]) j9 G & u' Q5 ^+ v; |9 J9 ^9 p2 L
}- U8 T2 T5 P: _" p
*/
6 F5 `7 ^% \) ?4 G1 o4 H: g //comment out all methods, N=100000 202s ; Y7 x; w( F; y3 S8 s2 o
}- H x: F2 C7 ?1 t5 W
% s, T6 ?# g; `8 A1 Z% a9 d
delete []b1;
1 d! N5 O7 s& q8 r! f delete []b2;
, e, G+ }& n3 R/ Q' ] |
|