TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
) R& s1 O5 [' F+ T* F* J# {
3 B8 ^. a9 \% {' a理了理思路,重新做了一个测试。
0 L3 n* `- O* Q/ u5 m+ a+ X j) y* [做了两个 vector 和 两个 float *, 都长 100000! w2 t- Z4 }8 X( S* ~9 z, k$ X5 n
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
1 t+ H2 y& I: _) `' u% s3 @* M: @- T' h# C, ~2 @ Q {2 r7 k) c4 `& A
内循环试了4种方法,
y5 I& K' @3 p1. 直接调用 vector inner_product 247s : P" j. V0 ~% y" s& g
2. vector 循环点乘累加 237s
$ q. y; h, V, w8 R( H: o' a3. float * 循环点乘累加 204s
1 M1 |1 K: l7 U7 }6 I1 w* Q4. 空循环 100000 次 202s
. p3 I4 l+ d5 k/ Z: Q( T* H- Z5 T* \; x( M9 e' t' h% ^
不做内循环 200s
+ L6 S4 \1 v% e
2 w. B2 G' b# [$ I/ U7 e2 ?你昨天说的对,内循环本身占比是很小的,大头在其他处理。
! G [/ I( Z6 r1 L2 ^; w2 a4 [另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
- f/ Q. O, l( Z1 d% i. d7 k3 ]3 ?3 b! A1 l0 e
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)& x: x: ~5 d! Q0 ^8 k, i S7 n% h
! U9 c/ D( g4 f) Y& s(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
' T6 i: @. M6 C _" |
' Y6 t) }) X t# e4 s# ~ std::vector < float > vec1(N);
5 G$ J0 E5 @' B; e0 M2 A" T std::vector < float > vec2(N);4 S2 |2 S- q3 w& H r
float* b1 = new float[N];4 T3 D3 `7 e7 {! r4 h% u
float* b2 = new float[N];
& W6 b0 g( L, u8 S) W9 u' I9 |
/ r& N! s& |1 d! q for (int j = 0; j < 6000; j++)& A3 d3 ^! m2 b1 @2 W1 n
{
* F& K R! Z* r9 @8 V7 i! S std::generate(vec1.begin(), vec1.end(), []() {6 p# c9 R, g7 I! D
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
" z3 P& D ~0 I8 A. u/ z( o });$ G! F/ F8 E" q* x3 q/ J. H
7 [9 T& L$ }$ L' l z std::generate(vec2.begin(), vec2.end(), []() {
, _# P) j2 x1 K3 } return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));; r2 I) x8 q+ M+ q# T6 S W
});3 _ Q: }( i2 r2 Z* d
# k g7 L- o9 b% X) x. G' R: ~2 g& U for (size_t jj = 0; jj < vec1.size(); jj++) M! ]5 @+ v$ x: J8 x8 D' W& C
{2 @; o. K- z( i
b1[jj] = vec1[jj];$ T2 _0 ^& n; x. ?8 b( ]
}! y) i+ @% A0 A% {4 ]
2 V6 D# U; q3 s
for (size_t jj = 0; jj < vec2.size(); jj++)
: f6 e- j1 W, B: c) O {2 w+ n" u7 o+ Z5 l0 [ I# U x
b2[jj] = vec2[jj];
6 J2 {8 _' r1 V& b; q8 e+ v3 Z }
6 }, g' ~7 V2 ?$ s4 H# O3 d' n/ c( l
//Method - 1 N=100000 247s
! s/ _3 W/ W2 O r5 k+ Y //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);* ?( a1 O. ]$ j1 ]! @; C# g
* z/ v6 Z1 }+ S1 T% e //Method - 2 N=100000 237s2 |* K2 n8 q% c3 R! d6 V) B
/*4 P( s, h' c- @( f$ k
for (int jj = 0; jj < N ; jj++)
* m. X, T6 F7 `( G {$ g( W, R1 r/ v
fresult += vec1[jj] * vec2[jj];
7 L F; g' a6 \5 z; V }
" T4 ^. _8 U$ @5 h( j */& \) Y! _8 [8 h/ ?, O
2 K& p* y8 \5 R/ n, S* Q //Method - 3 N=100000 204s" c9 N/ ~ u$ D# q. e z
/*6 w( b& w0 f& ~' S) O
for (int jj = 0; jj < N; jj++)
2 ]: M' l& {, C" W {
& t, x! C! \! Y/ }% E( H, Y" I fresult += b1[jj] * b2[jj];) u, F; f; S9 t2 n) ~: v2 J
}
6 O% ^8 F( t9 U0 l# ]' g3 n */
- A4 v% G8 d+ F: Q! Z/ z9 h6 q% ~
# T( J7 k: J' t2 N, s: F //Method - 4 202s
* ~" v% s) T! d m/ }- l" ? /*
' w" |$ V) Q2 o" \1 b+ a for (int jj = 0; jj < N; jj++)
; ~' b1 b/ `! I- w {! f- j$ @9 W5 w4 W/ z9 d
, p( I8 E3 e. I3 x1 N
}1 G0 o" e6 W* B" s
*/
' P6 t' ]. ~! [- i* l //comment out all methods, N=100000 202s & F! A# z, o6 V; K4 F! ?% J" N. o
}
+ N+ y( X) O& S O. B9 W2 r; }% i$ [! ?6 k B) H- e; @
delete []b1;& R- S6 i' x; n6 J- Q. s$ q8 Q
delete []b2;
9 p/ V+ c- k5 T& n0 i |
|