TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
7 ^: w; Y- u7 c5 J& G/ U! Z4 u
6 \, q0 x! L* F: l4 A. r/ d理了理思路,重新做了一个测试。
. z5 U G5 m9 @- V做了两个 vector 和 两个 float *, 都长 100000
% L0 e5 v# e4 @$ u外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.3 S$ P j2 d9 z- U$ O' m5 _
V, X8 A( v- L% [/ P8 m0 B1 T/ j1 i
内循环试了4种方法,
/ n: w) C Y" E: c7 [1. 直接调用 vector inner_product 247s 5 C! Q' w% T+ m7 w! X& N
2. vector 循环点乘累加 237s
/ p+ m m% R7 A F& M8 N3. float * 循环点乘累加 204s' X6 L% i2 l% {' Y5 y( p2 t
4. 空循环 100000 次 202s
4 k+ m& j$ O& s; i; R7 H9 ]0 \$ F. `7 ]4 z. K
不做内循环 200s: z4 O$ L" c) {2 n$ ]
/ H6 o! j" h' g8 B( ?# G你昨天说的对,内循环本身占比是很小的,大头在其他处理。& z F* y9 I u$ y! I: w
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
6 n; p( ?5 b1 d' F, N
3 j! e3 d) h. {) ~至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
! D* y/ V' C! z4 s3 g+ k. m9 B% I! @8 `
% P8 H# }- X v* T(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
N6 y0 L. s/ J7 N
, u& O( Z$ A# O/ Q% [' F" h std::vector < float > vec1(N);
5 [! Y8 `9 \8 z3 @3 a std::vector < float > vec2(N);' X/ Z8 `1 J% L" N
float* b1 = new float[N];
@- N7 U, C5 u* T6 i5 w float* b2 = new float[N];- D4 k2 i" Q# h2 e
' C1 v3 ] l8 W% J! k3 |' |# C
for (int j = 0; j < 6000; j++)
5 c. j: {8 B6 F* H4 ^ {6 H) l! E3 a1 j. q% F. W% T
std::generate(vec1.begin(), vec1.end(), []() {8 Y+ a E6 k" |! D' ]5 f, v
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
7 J1 ~* O+ f5 n8 {. x- u });1 K# k9 ]) O: a& k' ^5 c
: G, n/ U$ {0 a4 U. O3 N* W. _ std::generate(vec2.begin(), vec2.end(), []() {
% s1 j6 b( g- q0 n return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;9 x6 A l2 T/ b% J+ v k6 N
});
- O9 b( k5 Y5 s; R/ b2 u0 p. b, m# c6 \1 g n. l
for (size_t jj = 0; jj < vec1.size(); jj++)
$ i T+ R+ K$ Y( d {
2 `- Z* M6 Z5 s b1[jj] = vec1[jj];/ Y4 ^# a1 i+ M1 e9 J
}
. O1 N; |# U m8 h6 t% J
- @9 A+ W% W; c* u) L Z+ h' { for (size_t jj = 0; jj < vec2.size(); jj++)! h( @$ s$ s# x4 M
{! R" Q2 o$ y) T8 l
b2[jj] = vec2[jj];9 t- e5 h* _# t
}' X# w& c- B& H6 t* {, L
. [9 S7 n5 W3 v, C x8 h //Method - 1 N=100000 247s
! A1 m2 U. v* P4 c! S //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
+ U2 T) e' t- d, i; h% X) B2 h 9 y" U3 n0 _& @6 Q
//Method - 2 N=100000 237s
2 E; i' ^2 n& Z6 M) j /*
) G% g# N( c# N& K- D% e9 m8 g for (int jj = 0; jj < N ; jj++)
4 @' K- }% u/ e/ y {
3 Z( _) O% d" l fresult += vec1[jj] * vec2[jj];
/ G/ Z* }: d: \6 P2 y }
1 j: Q* @1 S: q' ^" }* C. T */% K4 E; S4 W/ z; T2 z# b6 I
& p9 P4 W4 ^& x5 D X- @* \% [, R
//Method - 3 N=100000 204s- `5 G% @/ T2 {9 P. o
/*% I) U: o, m5 P6 I" K4 [8 R
for (int jj = 0; jj < N; jj++)1 G) m4 ]: `3 X2 f# @
{8 s- m q: t; a& T+ A; s8 K+ f& I
fresult += b1[jj] * b2[jj];3 l, m8 J# l3 }4 k! I3 a
}
. i2 g; v1 \9 t& Q- _& _, ~ */
4 B. t* [2 N, V$ `5 g1 y) o. h5 G c; ]* U' M4 R
//Method - 4 202s
- J* q3 A+ V9 a% a5 K3 _# F8 U /*5 E ^' Z7 }9 l( X& A6 n
for (int jj = 0; jj < N; jj++)5 ^& O4 N N# c* b3 |
{6 b) Q1 e n; T, Q$ r
. o& O$ b& ]5 i }
9 Q, R" \/ |9 W( j* y */4 w/ g: k; l+ W
//comment out all methods, N=100000 202s
. F6 r5 @' F! i+ ^% { }
# M+ u$ f8 x& C
3 T. |5 K4 w) L6 H6 W( ?7 V | delete []b1;
# a! F2 X& {, G# e/ A" [& E/ E9 v delete []b2; . i! V; X: Y+ r/ c( Y# H- E
|
|