TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 0 L3 p3 S& b/ H, \ c) M9 d
) @) r6 m0 ^+ R' p理了理思路,重新做了一个测试。( `7 j& A9 B" R0 Y( o
做了两个 vector 和 两个 float *, 都长 1000006 ]6 `& f' \" i7 Z& z r/ j
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
& R) @/ q. q* z/ c7 X- s. s8 C( a& W
1 b* Z- a: H" O8 G( v- a, t内循环试了4种方法,8 X. V' H. z1 ]- w+ q! u% {+ D1 e
1. 直接调用 vector inner_product 247s
: {) M4 C0 p( }1 a! H/ [" G2. vector 循环点乘累加 237s
& I+ c4 n; {; i: k0 p# E8 Z7 ]* L3. float * 循环点乘累加 204s
2 \- {5 H' y6 n' p4. 空循环 100000 次 202s% `# l% U4 h+ m4 |( @1 ]# K
' F* R1 d9 [3 s9 I不做内循环 200s
% T# K7 q, I; c- \$ y' y8 h e9 x8 u6 {" M) F
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
4 ~+ u, `$ S4 h/ {( s另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
5 R# R, O: P' K, v, j, X
- r* [7 s( I: y2 p$ F, |% [至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
5 ~: F H! X7 }5 w! c
$ k' ]: u8 ? q. V(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
8 p; F$ E! W3 e8 a
* B0 q' h) |8 ~0 t! K$ O7 d* N# k std::vector < float > vec1(N);
% V$ u4 Y! S& n$ E2 o$ F, v" z std::vector < float > vec2(N);
% F1 x8 _) ^, M4 B float* b1 = new float[N];
! V0 F4 x B2 ?+ V5 G1 t* y float* b2 = new float[N];
9 y( S! u7 A8 f0 @3 i
8 A U2 ?3 X7 G for (int j = 0; j < 6000; j++)- w5 H! G9 G9 {5 u+ P; t
{9 [7 l) ^6 T. t: \
std::generate(vec1.begin(), vec1.end(), []() {
- K' r3 u' w n7 T return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
( T" {0 b5 w# m5 K; J });; P7 K7 q" i6 y' }2 s
8 A- K$ }- \0 L4 o
std::generate(vec2.begin(), vec2.end(), []() {
+ H# y/ n6 E2 L" p0 K A. c return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
0 {- `% R9 k7 i. [) o z });
, s* X. U5 h! _$ O: i
2 _2 C5 V& e8 s for (size_t jj = 0; jj < vec1.size(); jj++)
1 H8 i0 e" P. y! T, P* k1 g( q {
, K* V. }% c. Q5 ?% q; J9 V b1[jj] = vec1[jj];
% P- a4 Z3 G$ Y* p% P$ P9 T q$ P3 Q }
, \5 x; l/ b, s
0 H, {" }5 B4 O3 v4 b& F6 m7 L8 ~ for (size_t jj = 0; jj < vec2.size(); jj++)
0 T3 {: z. R% S {
" Q0 X, o6 m- o0 D5 Y" S }. Z9 } b2[jj] = vec2[jj];
1 W$ v) L7 h7 O- J# Y }% ]0 C6 O# {7 x0 f
0 i) Z# ?0 l. ^3 A5 x5 e, j" `6 R- d
//Method - 1 N=100000 247s : F) z' l# L; v' R) ]1 C% t8 V
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);; s3 V' \; W* `) \ c. M
# K6 T: c" z! K' q; h6 g! E //Method - 2 N=100000 237s
9 X* J; g6 Z4 m2 g; D% @ /*/ w4 K8 x. t6 c2 b
for (int jj = 0; jj < N ; jj++)
. V+ m$ p8 z7 {$ x9 o9 N {# S$ n+ z ^2 i
fresult += vec1[jj] * vec2[jj];
# {" B/ O+ T) ?& ~$ E l# f }
# g, R, h' K- Q4 O- o; v; K */( V) a- c& J1 U
! P @" h9 p. V7 l' Q' V: L6 J
//Method - 3 N=100000 204s7 A: i6 ~0 O0 K2 Q! I
/*
% B1 s7 Y+ \, n. N$ L for (int jj = 0; jj < N; jj++)
7 K2 N# d4 ~+ O7 S: J4 i1 x7 I {6 {9 A8 r' v0 V B- F! }
fresult += b1[jj] * b2[jj];" C+ W% |9 `7 C' |" a: q; U7 I* l6 h
}
, e0 ~1 L% B( `$ } */
1 j% {' o K7 z4 M
4 J8 h8 c1 ?) F2 j- R9 ] t' \ //Method - 4 202s
# Q" _& l9 P! |# {' b0 F /*
7 B2 u6 x2 H. y- s( Z& J$ K for (int jj = 0; jj < N; jj++)
# a4 r/ W4 @: J! N0 N* i* j. B {
4 k9 p+ b: L& g7 \: \$ v3 V/ B + @* g; `0 Q5 o8 o' N
}/ s _- v# C: @
*/+ G4 [6 B- ^' g& {% k; B
//comment out all methods, N=100000 202s
9 \+ A& U; r' n/ R& x* a% V+ E }( X% f* h1 e( L
! e1 j8 c8 w9 S, h delete []b1;
& V$ |4 u, H9 `: h delete []b2; 6 e7 X5 [/ u/ P+ s0 h3 |
|
|