TA的每日心情 | 奋斗 2024-3-29 05:09 |
---|
签到天数: 1180 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 - k; L8 E6 z% q; ?
]# |; W2 X5 K4 C% r理了理思路,重新做了一个测试。
\6 c* H7 ?" [( G6 k1 |做了两个 vector 和 两个 float *, 都长 100000' ]; L3 o8 ~: X; F( S2 s& B
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
6 Z. }9 _. X$ C; K. i+ V& P7 s4 Q/ \7 I7 I6 P
内循环试了4种方法,
+ @7 \: K! Y+ \1. 直接调用 vector inner_product 247s
1 S9 I; M a% o% X( @% q: p2. vector 循环点乘累加 237s
& m! C+ }( Y9 J9 a4 w3. float * 循环点乘累加 204s
" n2 {9 o+ s6 m& \4. 空循环 100000 次 202s8 [% d: b1 L' k3 F
$ b A6 n3 i: h0 k$ M5 j8 R
不做内循环 200s* N" D& i; W+ y9 {3 ^
3 X! Z" H: I/ i* ?! B' R
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
7 g. U% G9 \/ o7 s- t3 T另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。5 o8 b, F$ F# y3 K$ ~; W6 N
0 g8 z: G9 \3 q
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)& J; J$ X4 j, g1 O7 [0 w! }
1 W0 s8 _0 l- | E) F(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)3 h+ F v+ @' Z0 }4 J
6 c6 o/ d9 d" E) Z& h3 K, O
std::vector < float > vec1(N);+ [/ X" |2 a, i
std::vector < float > vec2(N);
/ ~2 V) c' G, t. R float* b1 = new float[N];7 f, d2 g$ z5 l( `; u; E: ^# \) X
float* b2 = new float[N];2 I& \$ @# D* c5 ~- d
! L; N; {2 i. {3 o1 p' m for (int j = 0; j < 6000; j++)
' `5 \8 b1 |/ j- X/ l {
, i% K' j9 O$ S7 e( A std::generate(vec1.begin(), vec1.end(), []() {8 Y6 Z2 r7 W8 W" _2 W
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;/ f4 Z+ \1 x( s5 t2 K6 \
}); c) i% @' o3 y4 Q
: g# i J \ Y! y* ~, Q
std::generate(vec2.begin(), vec2.end(), []() {
0 l5 z1 R& @1 f2 y- @8 \ return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;4 b$ A/ ~+ i3 N
});
! S& J& C7 c8 W1 o/ s3 \; \& H. R: X
1 e3 g+ V+ `7 t for (size_t jj = 0; jj < vec1.size(); jj++)1 @) L# m3 V! y
{
1 R6 [5 P: y* {2 ~ b1[jj] = vec1[jj];4 d! ?3 E+ Z% i# r# u; x7 R
}; x8 x. d1 Z9 n6 T, V% V
( l$ p. w+ }) z' @5 F1 U' q1 \ for (size_t jj = 0; jj < vec2.size(); jj++)
0 _. g' B1 A% {+ s9 b9 N {
; G( G, a( \; G1 o! v2 \ {/ T b2[jj] = vec2[jj];2 ?# X6 W8 @( G$ h3 W$ {
}4 g* z9 w1 A5 Q3 {7 O
) t! G' h: t* Y0 |, H4 j //Method - 1 N=100000 247s + O2 Q. i0 E: n/ |) c
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);) o) x' B; T, O9 H' E
+ H( \; n0 z/ a B //Method - 2 N=100000 237s
2 M0 X E# x) r0 r. [# x) U /*7 O8 _! q1 _9 I. l; Q4 w% S- e/ @
for (int jj = 0; jj < N ; jj++); @! k+ h* Z" t4 W
{8 ~# i& ^2 P7 U$ j
fresult += vec1[jj] * vec2[jj];8 S9 Q- V2 I5 A6 e- z5 q
}
% d6 y0 H5 V4 h* P$ o; G r */1 y6 B0 g6 U2 n3 O t3 k) I4 U
U% W8 J+ B2 V6 R! @5 G9 h
//Method - 3 N=100000 204s8 Q0 v0 V7 @% F& U& ]" I
/*
7 u+ s9 ~, o6 q& j; R8 V" ~& _ for (int jj = 0; jj < N; jj++)6 {4 V; ^1 b5 M* E
{0 [! f, |& g$ H# s% S9 |
fresult += b1[jj] * b2[jj];) d8 V' Q8 k. J0 ]2 K, ?/ D4 L
} J: S0 D2 H8 }; o1 y
*/
7 ]7 Z6 \# n- c- j" k/ h; o
3 V' t: H: I$ C+ r0 \9 X- T //Method - 4 202s1 C8 |* q7 W, \
/*4 ~, K$ Y0 e& ?) c
for (int jj = 0; jj < N; jj++)8 J! ~4 K' A. z& B- S
{
/ Y, J# k6 h( n 4 Q0 o U: Q& U3 J
}5 Z, X+ {! ]: U7 Y3 _; K r, \4 p
*/
% s) U0 E. ]& V* A7 c- Z1 f //comment out all methods, N=100000 202s
. F$ l. [1 V. x P$ @2 I/ g. E }
0 I8 N, `5 i' O X# `; P. w( X- V' v: l: D V
delete []b1;
# o: v7 `4 l8 Y; k$ o3 O delete []b2;
5 b2 Z$ e0 X7 R+ B, u* a |
|