TA的每日心情 | 擦汗 2024-9-2 21:30 |
---|
签到天数: 1181 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 3 r: N& y& d+ j e
2 Y& i8 B; Z9 \! [5 H
理了理思路,重新做了一个测试。; L5 C5 p4 x6 `3 u5 b# _
做了两个 vector 和 两个 float *, 都长 100000
0 g- P* y" b( \外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache., Z% X U+ w: ? _; ~0 ^* @0 a
0 V/ `7 w' }/ B r% g" @内循环试了4种方法,
8 M* ~; Q! v& U: n4 F! X1. 直接调用 vector inner_product 247s ' ]5 I. Q( M' i$ c4 k) A7 j
2. vector 循环点乘累加 237s
, c* r; U5 H* ]1 P* B" a3. float * 循环点乘累加 204s1 a+ l% F: q9 g+ }. |/ J3 `
4. 空循环 100000 次 202s
- E8 Y; d1 C* F+ _8 e
8 v# X# }' q! y0 D' d) d1 \不做内循环 200s
8 i/ M# @* Z( B2 n. G* w9 S3 n! e' Q8 K
你昨天说的对,内循环本身占比是很小的,大头在其他处理。0 l( J0 F: N$ X& x/ m4 z. U' A
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。6 u; q$ `7 I& ?; A7 p
9 a% L# l# @' }; Z6 u" F2 X/ ]; d9 Q至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
' f* _0 e( P" e- O# X, \; B3 p; }9 U, S6 @8 [5 [
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
# |+ K2 G! f K4 W. g, E# e: D' i) }" ]2 m. ?7 A1 Q
std::vector < float > vec1(N);, T4 H1 A7 @0 o$ f
std::vector < float > vec2(N);
( j8 i5 p$ I- |! t7 P float* b1 = new float[N];& r7 ^- w+ Y. R ]2 n
float* b2 = new float[N];) V' U0 [& L; G$ r8 ?* D
) {8 D) |/ g7 l) c2 A0 H9 n1 X q" ^
for (int j = 0; j < 6000; j++)
, P0 H; K) d1 s- n. _% z+ s: w {# s% i1 f4 O% n7 O
std::generate(vec1.begin(), vec1.end(), []() {
) [: U/ Q( X7 j# T4 n return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
% ~) |; K, ~) h7 W });/ B* T! v; d1 F* ]1 `6 ?& i" V/ q
1 ]$ N" S! r& f9 C# ~ std::generate(vec2.begin(), vec2.end(), []() {# G4 g* A4 A1 e1 `
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;, E1 _2 ?; d3 `" t5 e' e
});
5 P) x( q1 m. T7 C2 ^
9 V" \" C9 [/ l for (size_t jj = 0; jj < vec1.size(); jj++)
G1 s( a( }6 ^: d- E) ] {! m) p4 j( e& _' G* u) k5 |
b1[jj] = vec1[jj];. V, v- @4 u$ O) ^- h/ ^
}
( _ @; t5 v% Y% v- C7 o0 |/ r. ]% b3 i
for (size_t jj = 0; jj < vec2.size(); jj++)% p: [( E# @0 V7 X, p( p( O
{6 v, \6 j F( I- k
b2[jj] = vec2[jj];
2 }- R7 p* ^, k: Z }( V2 w2 H! b) {" Q/ B; }
' M! n3 ?1 K3 C6 {9 D$ z6 N //Method - 1 N=100000 247s 9 ~2 Z3 G9 l9 y: s
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0); S7 l# p8 W( s& K; l" q
( p) v" u% i6 d4 p$ x( B
//Method - 2 N=100000 237s
5 U- o! m* I5 F: B n2 D* R /*9 }+ z3 J5 W, P9 ?# @
for (int jj = 0; jj < N ; jj++)9 V' s8 C9 u" y) A6 z9 l( l- J
{
/ [( p T( _( O1 I1 H8 }# a" b fresult += vec1[jj] * vec2[jj];7 U" M2 r) z' k( W" ^0 Q' E
}
( V" p4 D/ _: ]5 x3 Y */ o4 j; b# ]. L% ]8 X
* s1 c2 {$ ~2 ?" b0 @ //Method - 3 N=100000 204s
6 u! F+ K8 ~0 }, a& w+ T/ H /*1 I$ W8 [) d( U( c$ r9 @
for (int jj = 0; jj < N; jj++) @9 q0 c# x( l, n# a
{" \% d4 n r: X4 Y" Z* ^5 r O) o
fresult += b1[jj] * b2[jj];
9 Y& ]5 s5 p; @! { }5 G7 q. P! U3 B
*/
' r- ?0 P# l! u/ H* [, S7 V
& Z' [' n" T( f. T //Method - 4 202s
1 _: F( g! p" S: Q /* m9 J0 ^" p, L. D6 d
for (int jj = 0; jj < N; jj++)
, ~' O( I9 C" g& Q) K {
( H& Y4 O/ m' @
) b% j- l ^3 ^3 U; |! O. ?! r: r }2 q) ^3 s% ?1 ~2 r4 x
*/
7 ~4 C" |0 [7 e/ ]# w0 o //comment out all methods, N=100000 202s
# U0 v# I$ g: Q2 W: ^ }
, x% L6 r/ Y3 v2 T1 G( b( E' @+ \" Z6 L) s: F/ D# ]
delete []b1;
6 A' N) o! }* C$ K0 U: F delete []b2;
5 ~/ z' B, x0 _7 p* M w' Q |
|