TA的每日心情 | 擦汗 2024-9-2 21:30 |
---|
签到天数: 1181 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
) A# ^$ e9 f5 J/ e5 P1 I7 g
: J( N; H! x1 [0 O' M4 X3 n: F0 q理了理思路,重新做了一个测试。
$ _6 E1 W/ |" S) _( T做了两个 vector 和 两个 float *, 都长 100000
7 z/ f7 M d; J& c3 Q% x外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
4 f5 L z+ m2 O- N' D
( v0 W' |, G) F内循环试了4种方法,
7 g. r* ] J' m1. 直接调用 vector inner_product 247s " I. ^8 }2 l6 W& q
2. vector 循环点乘累加 237s
6 b; G4 j1 \ k. Z' S3 @4 \7 s3. float * 循环点乘累加 204s
, o$ t9 O/ V4 M9 I4. 空循环 100000 次 202s; z& G& v) C. k- n$ O) u/ [
1 Y+ s+ H5 ?1 ?
不做内循环 200s6 v6 h7 b5 R5 Q! t
4 y2 o* o% V' p3 w( k7 t+ h/ P
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
: ~5 K8 D$ T U9 U另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。3 u! K# E8 P' P$ S5 \6 L
9 ?4 v' D" w r4 N3 I2 l至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
* C5 O3 F# }7 n1 u( X6 Q( R6 W# V6 M/ @5 f8 W2 c
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
% m, f- [+ Z: V
* H* G6 F" g2 }& @. U+ @" E std::vector < float > vec1(N);
# ]; h2 j p6 \/ ]% m std::vector < float > vec2(N);
3 }1 [( {5 p0 e/ Y9 q6 Y9 l4 n" Y0 p float* b1 = new float[N];9 J) O, O; l6 @4 f3 z. D( p; E$ R
float* b2 = new float[N];( u% n4 v; L; b2 @, K9 G
7 ` n3 ?. p& B& G& ]( Q* A( |
for (int j = 0; j < 6000; j++)
' n; v9 f: d7 S5 l( b* d {, o/ D% D" l5 v) j/ v4 c
std::generate(vec1.begin(), vec1.end(), []() {5 n' W: E1 i9 ]# l$ d# \
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
1 \7 M* }( S+ G7 g9 @- x });2 I; l. m2 R) R* N2 t" V7 b
/ C0 e& N0 B9 G& j& D; W
std::generate(vec2.begin(), vec2.end(), []() {4 }, K1 z" O' L
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;$ T, f5 p* t. u0 K. |
});
( b5 V2 ?9 t1 F! r. P) n
3 Q* p; g. t/ O0 l for (size_t jj = 0; jj < vec1.size(); jj++): O8 V* f! H6 k; q7 L
{
, x! }8 o3 G( ~ b1[jj] = vec1[jj];
% f/ s B6 }" v; c: ?3 e+ g }
& P W% j% Z {# A1 v
2 l% p# E$ Y" J& ^; f( K2 l( D% U9 e for (size_t jj = 0; jj < vec2.size(); jj++)9 Y. z. c+ G: L$ V2 }* E( e
{5 q4 ?* C2 ^$ h; v6 z/ O1 M
b2[jj] = vec2[jj];
, X1 R5 f t8 Z6 U }2 q! i! e9 G2 i/ |1 H m
! w$ {$ T9 n% P g; B
//Method - 1 N=100000 247s L! k* B( R* M6 j; Y- C
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);7 }' v! ^2 e) L( u. ~/ Y3 M
5 V4 d: P! t- F" `: R //Method - 2 N=100000 237s ^$ {2 q, a9 I0 B2 ~& w" V
/*! W/ [2 D, s3 a
for (int jj = 0; jj < N ; jj++)
: e3 a, @# r# A3 F0 _ {
( o% T' f2 j0 A# e Y fresult += vec1[jj] * vec2[jj];: O6 W8 z8 J1 `& D* f8 }- B& ?- A$ W
}4 ]2 U8 o; t4 o
*/
1 M9 i1 Q% T6 z& G6 U2 f
, B3 J9 _+ A/ p8 t //Method - 3 N=100000 204s
+ a! E' ^' b. V1 r% O7 e3 |0 L /*
q3 a, p' q" T0 k" M0 g for (int jj = 0; jj < N; jj++)
5 p; a/ M: A) c" Z {; I" M; u0 `6 f& G! v
fresult += b1[jj] * b2[jj];
" \: O% w; a: p: t9 J- x }. |! v' W, S1 B& l+ h! ~9 U
*/
0 T1 U, p2 r4 Z1 X
6 n& e& `3 X5 t8 q //Method - 4 202s E) m" o) ` z& [; Y* O
/*2 h w7 W' K) \' w
for (int jj = 0; jj < N; jj++)
) Q8 S" r" u+ ?& O3 @5 c {
( l& @, Q; X( A' V/ U4 K, n( T
2 O5 W% ~- a0 L/ i* E; @ }( A: Y3 c' M# c. a4 F. t
*/
0 V2 I4 x0 o' C5 H3 } //comment out all methods, N=100000 202s
8 D$ |3 I4 J0 i }
3 }( F, W9 ~( I6 D6 ~; p$ j
2 O# Z3 K' z( M delete []b1;
, |4 \2 c9 U) d: r; B delete []b2; ; `$ Y0 b" P( a8 Y" [; c
|
|