TA的每日心情 | 擦汗 2024-9-2 21:30 |
---|
签到天数: 1181 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 * ]# _+ M& `- H, C; U
& E' s2 ]- L% S& Y* X
理了理思路,重新做了一个测试。2 W2 B# U2 v6 i' o; @ y3 @8 m. r
做了两个 vector 和 两个 float *, 都长 100000
* K6 Y1 _9 b) g, S& X! x2 j. l外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
4 z a6 T: H0 L ~+ d3 S( v- V. z8 w6 N8 j& \* I
内循环试了4种方法,5 B/ n9 i# U( V# V6 Q0 k) ~
1. 直接调用 vector inner_product 247s
4 V/ F" O$ f7 y5 P+ X0 @2. vector 循环点乘累加 237s
2 ^; f/ w) X) K$ b* m/ B: u0 }: j3. float * 循环点乘累加 204s1 Y# z' `% l# n0 |, Q4 `
4. 空循环 100000 次 202s1 J( T3 T6 _8 B- _( Q% v0 T/ U4 E
) D/ V/ w4 t: _! w% x1 m% Q+ V$ Z
不做内循环 200s9 a) o3 G( O; Y6 K6 j7 j3 O; K
) P% a, C% k3 F1 b: w: q
你昨天说的对,内循环本身占比是很小的,大头在其他处理。6 w) Z+ ~1 T5 t1 U; a1 R
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。- V& T: Z9 c5 Q
: J5 @* h) U% P/ C至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)8 ~( P# r% ]9 K- ^
/ u4 q' K1 w, a: |, j% o(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
5 S8 N+ v- L' a1 X! P' C4 q' j# R; Z, z+ z
std::vector < float > vec1(N);( @. E5 o3 x1 F
std::vector < float > vec2(N);9 I* Y5 d2 B( Q' M0 [* L
float* b1 = new float[N];
/ z7 t+ y4 s9 O& \9 o float* b2 = new float[N];
0 A7 j1 u6 f1 c) S6 B, q. y2 E' w$ J$ J& j2 F+ m
for (int j = 0; j < 6000; j++)5 D8 j2 M5 A' j+ p8 u
{" q$ @0 r' r/ F! A" }
std::generate(vec1.begin(), vec1.end(), []() {% ?; @. h/ }: m' Z
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
% ?7 o, U# J/ G) Q& N: x });
% v0 B* n" ]! j$ g+ D4 l+ _0 o; ^ F( H
std::generate(vec2.begin(), vec2.end(), []() {
, S3 K6 |- y* ?; ^5 w return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
# v5 G( {1 B0 i# g6 | });8 _: a* A6 K" ?& B* r( u9 m
# d- j$ f1 k+ y for (size_t jj = 0; jj < vec1.size(); jj++)9 w1 @: @8 O* I$ D# w2 L) l$ C
{
8 V, `8 [8 u1 U) C; {0 W& l0 Q b1[jj] = vec1[jj];
1 E) V0 Z y2 c- }; k; f! K1 O# ~ }
- z. ^3 q5 x4 U$ R! c0 F
- v2 R3 l( m# \8 x& ]3 b ~ for (size_t jj = 0; jj < vec2.size(); jj++)
# T# m8 `0 L8 O7 F9 T, l {
5 Y" @, o/ X/ Z' w" a, k$ G" R3 G b2[jj] = vec2[jj];, A, g" _: V% d/ T
}$ e/ Z+ P: v! C! J6 H
% m' d7 w5 X l( S; G //Method - 1 N=100000 247s
6 P; D; C* k2 u6 s8 i! [ //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);9 p9 i4 I/ Q7 E1 r3 i
4 `3 B V5 P% o7 d& e. G, W8 \
//Method - 2 N=100000 237s" s' P" L" E) ?
/*
" a5 ?5 o- T# a! P# `* q for (int jj = 0; jj < N ; jj++)) L/ m0 ~; W8 u k
{% o$ g3 v$ ^6 l' ~& c2 n
fresult += vec1[jj] * vec2[jj];9 o) k# l% ~3 J. s! }
}4 I1 v2 ]- J) V/ l, x! k( q# \
*/* m% a- B6 k7 ^$ N. N
! D0 k( q3 o& _8 D/ r //Method - 3 N=100000 204s
3 n0 T1 x0 X H9 V x, e1 E0 \: b /*
Z) X# v6 D& \6 q for (int jj = 0; jj < N; jj++)2 E7 N7 \/ ~. X6 p" e3 i5 q
{+ a! O5 S' c* O
fresult += b1[jj] * b2[jj];
6 K3 b8 d, R+ }4 H P/ ] }; h7 c$ z& B7 U0 k/ d
*/
. a2 A4 C7 _/ D- c2 E$ ~/ q( Z- K$ _3 J8 z |6 `2 v: Y& W
//Method - 4 202s9 |# k2 H3 r1 J2 |
/*
+ n, m& s: ]1 c- ]+ d( } for (int jj = 0; jj < N; jj++)
& J$ s% U7 H `- B1 ? {
! N7 f' u; |% h3 A4 U9 z& R
+ \# J8 P* p4 G' s4 [) @; s; B, g' u }. g6 j8 P1 Y! X( T) x& _
*/8 T4 m" c$ G( U9 I( q4 p; @
//comment out all methods, N=100000 202s $ q( }2 Q7 q" j' g/ E3 E" |
}: f, b$ e, S- c8 X' n
5 F. R, |% U6 b. ]5 B; h. ` delete []b1;0 b+ @1 ^/ B2 g4 z# k; k( T; E. B
delete []b2; * {6 H9 M, O t2 f: n' L
|
|