TA的每日心情 | 奋斗 2024-3-29 05:09 |
---|
签到天数: 1180 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 7 w& f' S6 V& h9 _0 A# V3 ^. F
. Q# ?5 Q" h) m5 f3 u
理了理思路,重新做了一个测试。
# E! @) S9 d! E4 E. U9 W做了两个 vector 和 两个 float *, 都长 100000" T j4 B. _" N4 d$ h
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.# a; f2 W* l7 C7 u6 R5 C9 ~- c
% R2 D* j, T0 G! ~/ `3 N内循环试了4种方法,
+ q3 c" ~ h, g3 E- v C4 P1. 直接调用 vector inner_product 247s ; e; ~% c/ p" C
2. vector 循环点乘累加 237s- W: I. [% r( ~6 b5 n
3. float * 循环点乘累加 204s
- L3 m& d5 ~: S4. 空循环 100000 次 202s) F) {* B$ X9 [
5 {6 B* [1 X ` ^' ~% D3 w& p不做内循环 200s% |. S$ y1 D% T
* i% q* g" K. l
你昨天说的对,内循环本身占比是很小的,大头在其他处理。* ?' I8 y1 |- B' V5 G/ N9 c/ U
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
; l2 k1 M& u& C, }7 X1 b5 D* X& K# q2 Z8 M7 _
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
0 w$ [5 b, }1 k$ h2 p* H
; p; _% k. o1 Y) x(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)9 d' o$ U9 c8 N6 L9 W% u
: T7 d% Z" j8 c1 y3 O std::vector < float > vec1(N);
. T- t$ I+ v ^& S+ y$ k std::vector < float > vec2(N);
" `7 c1 S/ i1 A/ I/ T" Y7 p7 ` float* b1 = new float[N];
5 @ C" H& G. G* ~ p8 d float* b2 = new float[N];
! j0 I5 J/ K7 o: b3 b2 }
4 j+ }0 o% D/ G, s for (int j = 0; j < 6000; j++): a! ]3 ]+ e" r$ m* R9 }
{, U$ e, J/ N4 a3 B: }4 O3 _/ N- i a
std::generate(vec1.begin(), vec1.end(), []() {
! y8 V3 }3 L) a T return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;+ B/ Z2 \1 a3 E$ q
});
/ w( n0 L) g6 I/ s6 n- D d3 t$ w2 }. V
std::generate(vec2.begin(), vec2.end(), []() {
0 q/ H8 D& r, F4 P- V, S* R return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
% i! H9 F, Q( G2 \ });
# ]7 A) _2 F/ x4 {4 P4 q
7 p: Q% w0 C- b6 ~: Q$ _3 [ for (size_t jj = 0; jj < vec1.size(); jj++)
0 L4 h7 m$ F( R# W3 S1 q: B {2 F2 G; }5 {3 I- V
b1[jj] = vec1[jj];) |; m: d( s" W& t
}8 `: S) U+ d7 j2 ]" F; n; D
- M( ?: {* d+ k1 _6 V. L for (size_t jj = 0; jj < vec2.size(); jj++)
' a( \. ]7 z# D2 f' C. m: L3 q$ Y {8 R) v$ X' W& \$ E
b2[jj] = vec2[jj];
+ m* r/ ^ V" M4 W }+ l5 ^! L0 B- j' K
; E& [5 P2 }" y2 X
//Method - 1 N=100000 247s * K7 Y; f2 E5 ~
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
- T' r2 [" B3 y2 W1 K6 |9 D & w+ [' E9 z: ?* ~& v7 \
//Method - 2 N=100000 237s
; H+ @2 q- O1 X* g /*
! N- W. P" H+ _4 m: [$ `) }0 x- P for (int jj = 0; jj < N ; jj++)9 D) ^. ]" b: w7 }8 ]1 u7 c2 U' w
{7 z9 y6 @. m6 t# _
fresult += vec1[jj] * vec2[jj];
8 G/ V3 Z3 G# i( | e } @% z! ~) }" V
*/+ ~1 w4 N8 n2 V. d) J, a9 q X- ^8 }
! ^. M8 F" C9 U
//Method - 3 N=100000 204s2 p" V3 O$ ~6 z3 e
/*8 V& ~$ T, d7 O& N
for (int jj = 0; jj < N; jj++)
: _" F2 \ I4 e' d- h# Y. p. N {" W6 B/ @$ h q- j$ f. G8 u5 d
fresult += b1[jj] * b2[jj];
/ P$ y+ `- U, A' d" n4 K } M0 N( ~8 T' C
*/; h& F7 N0 Y, D/ Y; G9 V
; |% J7 c E ], M ` _5 P //Method - 4 202s
+ \( p$ w: G3 _# n- r2 ~ /*
8 C3 c: O/ o [, P: @$ s. r+ B- f for (int jj = 0; jj < N; jj++)
K6 f/ e' N/ t8 C3 y6 t% Y' c {) r8 q+ W$ ^- x1 Y/ R
0 h8 f3 X/ S$ p2 Q
}
, I+ a- b1 u$ K% Z; t. r */
; I" K5 O- P- A% f& q; m //comment out all methods, N=100000 202s
3 ?) s6 {$ W1 K1 }5 }4 T }
4 ~, l+ B1 I% S9 ], i
2 j& O7 ~' K1 O- [ delete []b1;1 K% c0 I' t7 ]" [ y
delete []b2;
# X1 {7 _# t: K |
|