TA的每日心情![](source/plugin/dsu_paulsign/img/emot/ch.gif) | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
# Q! W6 x' c' q; i+ R; K& @- R
+ G9 U0 r3 |: Q* K理了理思路,重新做了一个测试。/ G, y, B$ _' T: A$ M
做了两个 vector 和 两个 float *, 都长 1000007 F3 t# ]' _) l+ O
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
+ R8 f& `6 _0 d5 v% r7 [2 T. o
- s9 U" c) k- R6 q内循环试了4种方法,
" O. v, U5 c+ p: Y! ?- r1. 直接调用 vector inner_product 247s ( Z0 Z+ l" @' _* G% F
2. vector 循环点乘累加 237s. C5 q6 u/ Y( e
3. float * 循环点乘累加 204s5 v* s, {# F! _# w, h
4. 空循环 100000 次 202s3 }% W2 @4 v( X* j8 _6 _! s* a* u8 P
$ ?# s& h2 w, a$ y7 K$ }不做内循环 200s5 W) `' q d$ {) W1 b2 n$ Z2 g) h
. n6 \7 b* O( }. r你昨天说的对,内循环本身占比是很小的,大头在其他处理。
, [5 [" t4 `; h+ r7 K另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
. i* C* \" n% l4 v
2 x4 M, W T7 m# o/ c2 C至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)1 G6 F$ M: X+ C, @0 m/ q _& p9 Q
8 ?8 I1 `" P' l8 [. v: L
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL) n2 @1 O* A0 p; f
. {. K/ z) a* }
std::vector < float > vec1(N);
5 O- b. i4 C) f+ Q0 w& t std::vector < float > vec2(N);$ G+ [7 a7 @* d; a# @; I
float* b1 = new float[N];3 {$ V% s; B: W# u/ A5 ^9 h
float* b2 = new float[N];
# E6 U( c4 t8 T7 d6 @" I. P& M r. ~9 h* o9 s2 A# C
for (int j = 0; j < 6000; j++)
0 o+ b0 d# ?# y$ j, x/ Q {1 Y" a' g2 S' t! C( r
std::generate(vec1.begin(), vec1.end(), []() {
! ]8 `) U" ~% m return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
; e! N" t6 t2 v: i* [" M0 Y6 h% P });+ L- Q5 D0 n+ z3 j7 T w
: b* u; H% }5 O& r4 C
std::generate(vec2.begin(), vec2.end(), []() {3 n: ^ w$ B- W" C
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;3 q! w' B& @) S: {9 [/ I8 s2 c
});
! W# H; j" h2 g. n/ _$ N$ v( E
for (size_t jj = 0; jj < vec1.size(); jj++)
) d2 U9 Q! Y# e+ q( c {
: o4 I, {" k; ?' q b1[jj] = vec1[jj];0 a( O3 {7 E; E# ~/ j7 Z
}; M y7 R9 T8 _ d- e2 Q1 ^: y
4 P" V& _; r% Q9 c* \" I for (size_t jj = 0; jj < vec2.size(); jj++)
/ J( ?9 g+ x3 A+ n* i& b {) h/ N3 g% U- F8 E, v& }
b2[jj] = vec2[jj];6 Y; H* P- W& L- C' T* w& w
}- D) Y& A; B2 u
5 S6 F8 V" c. p: B& _
//Method - 1 N=100000 247s 7 S& n" N# p" I3 X+ Z) F1 Z. T
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
% z& I& s" g3 ~
4 g% ~) J7 L, s. k. l' x //Method - 2 N=100000 237s
8 @, a: s! \: S. W+ i8 v' ?( y6 E /*! b+ c" S) r% j. q- {
for (int jj = 0; jj < N ; jj++)
8 p2 j4 s$ d6 j* j8 k M4 Q% t {2 G' O. P: d" ~1 I$ S. B* A9 v
fresult += vec1[jj] * vec2[jj];
+ w* E; X/ g5 r }
' L& c& E" B2 v6 N- Y */( S$ Q$ y+ V; @5 a
A3 P3 p0 N* z2 t
//Method - 3 N=100000 204s# E2 y- u) \+ d! Q. A P6 ] L* O
/*
1 M) ~" N5 z# T7 |, M% C! g; N for (int jj = 0; jj < N; jj++)5 t' g F4 ]( X/ d" P' k& {
{
; W& o" ]5 R$ n, U! ` l" a fresult += b1[jj] * b2[jj];1 \2 N( u' s( R7 K7 L; G% L1 w# _
}) {8 q# K$ z4 H& W2 I
*/1 Q+ H6 B" w: }% ` u4 y s" d6 A
$ A6 {3 n; Z; N/ W1 W# ^, E //Method - 4 202s
+ X) s% s: e. Z /*
1 A& I* v" y5 F) {1 \* } for (int jj = 0; jj < N; jj++)" j. |( C: t3 P+ ^# P+ q
{2 V- o3 N3 q) Q) m1 U/ L/ G, ^
+ n9 O: [9 h5 C+ P5 L$ y1 U8 F4 N* h
}
+ ], B- e6 ]4 R# O) o */
: U0 P; b6 |0 ], `7 A) t' j //comment out all methods, N=100000 202s
8 z+ O9 T2 H/ n' g0 } }
& {9 D) ]+ G) s& }7 o! B+ T. e0 f% S8 s- U$ l o
delete []b1;
7 W. J" g: q* `9 t% |- O delete []b2;
| B/ T" C3 O |
|