TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
+ C# R: ]: f5 k* m( N5 S7 y4 R: A) C( H
理了理思路,重新做了一个测试。4 _7 l& y- F9 ], ]) `
做了两个 vector 和 两个 float *, 都长 100000; N( j! q" Z$ R3 r/ p
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.: q+ I; E$ m2 i6 z. z3 b1 u
8 ^; d6 w5 w) v5 Q ^( `2 A# n内循环试了4种方法,
# S/ k( [$ _4 O2 x; J$ U& C1. 直接调用 vector inner_product 247s
, i1 g, p/ h# K, \7 T. `2. vector 循环点乘累加 237s# m) k$ A `- K: V, `
3. float * 循环点乘累加 204s9 X* H- C* v) x! T
4. 空循环 100000 次 202s
. r& ^. |7 K0 L# D, C* ~: h& j( |, @/ i- b7 Z- y/ q: s7 a( P
不做内循环 200s Q* X5 d* L" w; p4 J2 P; Q: j
# F" ]( w$ w) ]. ?. Y+ _% m4 G你昨天说的对,内循环本身占比是很小的,大头在其他处理。
2 E, Y0 [3 x1 m5 h另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
" m/ ~! J& }9 R d7 ^
- f) F+ B. h j( ]$ a至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)3 P. y4 M2 Y0 r3 d0 i
* a5 J8 S! i+ \* h: S(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL), J/ A' R% k9 j
6 }+ W8 Z( Q/ l std::vector < float > vec1(N);
7 m5 L( a: S7 Z% j; ~1 U5 v std::vector < float > vec2(N);
" X" m5 p( W) [- p; ]% W float* b1 = new float[N];
5 I9 |& a, @0 v float* b2 = new float[N];
% C/ z9 r% g# [# o$ e! X' L4 a/ W( e% O2 E# P* A2 F2 H
for (int j = 0; j < 6000; j++)/ ^) w! J0 H9 a7 f3 l$ k; k
{" l2 M# b6 y" `" }# E' c
std::generate(vec1.begin(), vec1.end(), []() {. }% L/ e- ~$ } F9 \
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));; c S" c+ y8 R5 K
});
0 V1 }4 R- V6 H3 N5 d) C+ J1 ?+ X5 i2 }) S$ Z4 u7 _1 |
std::generate(vec2.begin(), vec2.end(), []() {
, b/ a( \+ `6 j5 q% i return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;+ b( |) |1 X2 A
});9 o3 J& f% w6 ]9 E5 ~
5 U# A5 ^2 D7 r# s( J) n) w, T
for (size_t jj = 0; jj < vec1.size(); jj++)
) f8 M( K( X' _ {3 ^+ y. J, L& b8 j, a: R% ]" b5 b6 c
b1[jj] = vec1[jj];# ~3 J( a) V/ L1 S8 ], x3 }
}2 l C! v1 K$ w1 f. N9 T4 B/ ?1 x8 |
/ ]& E8 C6 y1 V; B7 V
for (size_t jj = 0; jj < vec2.size(); jj++)
6 D9 s3 S j' S& U( x {
# } E7 c6 X1 F, M b2[jj] = vec2[jj];0 ?) \$ @# I/ }& g2 M% O/ H A
}
2 [) ?' {( |. c& B( L4 P
8 {7 s: V) ~7 H8 }( B' x! P. c& P- x //Method - 1 N=100000 247s
2 a( M9 t7 n( Z0 T) O //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);4 @3 b8 i, L9 P1 J7 ~
# J4 T" j6 Q, b) f' i3 P) p% R //Method - 2 N=100000 237s
1 v, V2 U% F& I4 H /*7 r0 J- n$ D" G9 X2 I. R& W
for (int jj = 0; jj < N ; jj++)
" M ^" q, x; U: j" l {
+ \# @2 D6 N7 M& Q, K fresult += vec1[jj] * vec2[jj];
! w4 n8 J, O9 J5 Z' k }
" D' d5 z- X: E3 _! S */" [- ^+ M! G9 w: L; T4 n
0 K# `( |: D% \. y7 H$ W* Y! [ //Method - 3 N=100000 204s/ W9 f- h9 i+ Y a
/*$ k! \6 U$ k: l# g
for (int jj = 0; jj < N; jj++)
* z7 m. \& J) I6 [! J0 l, l {% C7 m; m" M1 O3 N+ O+ C I
fresult += b1[jj] * b2[jj];* Y& s+ h; D/ Q/ @5 l5 p
}* Z3 q. f- \0 t8 A
*/
" |# ~6 F9 a/ N9 k& ]! e2 F1 _* D
- n- e" p/ C7 [+ C3 y: y //Method - 4 202s
1 c# M/ @4 ]" g$ `' D /*) m/ M" m: g* F$ ]
for (int jj = 0; jj < N; jj++)
1 S$ p5 j9 j6 S5 C8 H, \ {0 b0 K; l. J0 Z. P& x' @( ~
; W, h* `* w: W; v' \5 ] }0 a; _) t% C3 b3 }' t" A
*/$ `8 G2 ~" Q- `0 z
//comment out all methods, N=100000 202s ( L* P, r* j4 F$ x! P
}
( ]( J) x% T( T7 L3 N7 F# b
L$ h+ O$ c. R3 s delete []b1; I4 b3 M& j5 \( ~& O* [
delete []b2;
. {; U0 e7 r5 F# Q |
|