TA的每日心情 | 怒 2025-9-22 22:19 |
---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 - l. K6 {+ s9 F8 U4 Q5 O8 J2 R# ?/ q
+ y/ r' W7 Q( }理了理思路,重新做了一个测试。
7 Y7 y$ A J8 `- l$ r9 L$ Z6 I e做了两个 vector 和 两个 float *, 都长 100000
- e- _4 C9 B, u z# w2 g5 D: l外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache. m8 P2 A* U( R" @! p+ u
. N0 _' ^; y2 P' b0 W! K内循环试了4种方法,9 D v4 @2 @; L# V, _: i
1. 直接调用 vector inner_product 247s
5 z) W0 U6 t& i9 `0 |1 w. O2. vector 循环点乘累加 237s" ^# k* t, b6 t& k P! v" m
3. float * 循环点乘累加 204s
# ^) P$ P! i v* \4. 空循环 100000 次 202s
( t$ z% m4 |' |/ w! m: ?" V! r" L# \9 c& f: E9 G+ Q8 a
不做内循环 200s6 [0 c) L8 W; |9 N- V2 l
$ q4 x% R: |& ~) d/ W你昨天说的对,内循环本身占比是很小的,大头在其他处理。
- n2 A7 V8 k* m" E另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
% S1 E3 \6 a. Z) n& ~0 f( K6 |. ?
+ ^" Y' d, M: T; \8 g: J; \至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试) `7 S: p+ b+ \1 ]2 i. m
! [! R0 Q2 L7 @ `* f
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)& a# \( k2 |! A: D' W" ]
/ f" v3 p" _# K: T' W5 v4 ^; ` std::vector < float > vec1(N);) p1 x- d$ D* e, M+ L( p
std::vector < float > vec2(N);3 z: a T- t/ c- Q4 s$ Q: r
float* b1 = new float[N];
@ H- a: E" l float* b2 = new float[N];
# V4 t. Q* F V# i
; N! K5 F! X1 P; X, e- T for (int j = 0; j < 6000; j++)
) _/ A2 m0 J: J" M3 W: A { r1 {. S0 U: R6 o( k P
std::generate(vec1.begin(), vec1.end(), []() {. Q' E0 N: w y4 @" f, p) Z
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
- @% }! f' v0 ] });
* Y/ e, b) ]; z- ?* G. \1 J$ i
9 p' x4 x7 W8 z' B. L std::generate(vec2.begin(), vec2.end(), []() {* m7 j: G. D% }! D
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;5 U" Q& j6 X! l
}); S Z- r: v! }% s T- d
7 r- y4 S2 m* T5 |! ?. v- E for (size_t jj = 0; jj < vec1.size(); jj++)& {. l9 y' G+ A' e/ a
{' X1 R5 ^& d/ u3 @2 v
b1[jj] = vec1[jj];7 E# u/ V1 \2 G8 y0 C3 Z2 w
}
; m1 d4 M) v" X2 _' b; G6 O1 ?3 H0 ^+ P
for (size_t jj = 0; jj < vec2.size(); jj++)
" r5 U5 s- Z! K4 Q& M { \4 _* P+ [5 f+ C4 S& {% Z
b2[jj] = vec2[jj];
4 l) j L1 o0 I a }, {8 W" `; Y% \' j. ^" d
7 g% z( \, D( s- E) o, o( w* K3 f0 B1 U
//Method - 1 N=100000 247s - [; K! }6 ?# n( _& N* B
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
[4 _* n" P O
' C; B8 R9 I1 T1 x* f! S: o$ x //Method - 2 N=100000 237s2 f6 T- B6 H+ T+ h. l$ B& N8 g- w% B. o
/*6 y0 s0 g p. b, r: x
for (int jj = 0; jj < N ; jj++)
4 g8 ?) K4 D5 O {
& n& J4 U0 U# ^, m7 b9 G fresult += vec1[jj] * vec2[jj];8 t9 h( u; v; ~
}' b+ R# m. K7 e# G" ?* ~+ R" t K
*/
, d" ?) B" S) f ( ^# [$ n$ u6 X9 q' p
//Method - 3 N=100000 204s3 o" n. \6 g# [% P: G. x
/*3 t! ~) M3 ?+ _6 q7 d
for (int jj = 0; jj < N; jj++)
6 k5 P% S& S% q# K [) g {
; x i/ _* i0 `9 z" P" y2 _ fresult += b1[jj] * b2[jj];( d7 g, `' Q* `2 n6 o! ^" p
}- D& \2 G, A$ N0 b
*/; [6 L: {0 Q# ?7 B' S- N; u
! V! B: H+ [+ l //Method - 4 202s2 m1 M C) \7 T
/*
& Q$ d8 W/ t9 U) r" r for (int jj = 0; jj < N; jj++)
9 H# P# B$ q$ Y' ~& q. d {, |# b ~! K9 i D! T4 A$ d A
1 q1 o6 \' z& }& M$ {( u! {0 I/ z; X* A/ g
}
- x: q# v! K8 A8 B */8 t$ a' i# P# b6 Z) n7 m) {
//comment out all methods, N=100000 202s
5 k: z. a9 ]& n" o5 C" @ }
- O5 _2 g- y9 U6 v3 h; E1 I3 F3 g
delete []b1;
" R) h R3 x1 n: l6 E) p' u& V delete []b2; x; u7 [4 ]) F. x
|
|