TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
* N7 y, o8 w# D/ X: c
: H. r( e4 V1 h Y) E% Z理了理思路,重新做了一个测试。
9 i: G1 ^2 h: k做了两个 vector 和 两个 float *, 都长 100000
) Q# L& h5 R$ \外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
( e+ t u7 U0 \. C1 n( K8 B" Z
3 N! R4 L3 H6 L" H内循环试了4种方法,
_) H* q/ \# E2 r1. 直接调用 vector inner_product 247s
1 ]3 e( }' D/ W+ p( g2. vector 循环点乘累加 237s7 O8 I; m0 x( n1 F9 Q& T. M
3. float * 循环点乘累加 204s
; ^) u: b( A' b6 O6 U4. 空循环 100000 次 202s
7 m; I/ E( }$ p \7 a
$ }0 F7 \ C+ ]不做内循环 200s8 q) l) E4 M5 a0 {: E! L
' L- z/ X% ]& C `9 Y
你昨天说的对,内循环本身占比是很小的,大头在其他处理。' d! b9 a% N# c. ~7 W; b5 G' a
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
0 V T" u5 ?3 g* N4 Q
, p, |. H6 n* y8 ]至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)4 d. G. O J8 J, V
$ g4 ?9 M# H/ [4 p7 |; b3 e8 K: ?(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
* N7 m. C8 S" V- @: s# O4 \8 y8 ]. Y8 z) X- z* C
std::vector < float > vec1(N);' \8 V4 F6 e* @: X7 q' ^: f
std::vector < float > vec2(N);" S, R4 c/ _* T* }6 T
float* b1 = new float[N];8 Z& @* v# ?& }9 M9 Q0 P, r
float* b2 = new float[N];
9 R7 E+ P+ m" c% J% s# q' K- f4 ]9 L* s4 G0 y
for (int j = 0; j < 6000; j++)
. K( p5 v/ T& _: U {
2 O& p: V; p/ K! ? std::generate(vec1.begin(), vec1.end(), []() {2 n J! u& x( P2 f2 V
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
' |# f9 ~/ I' W });- J% G/ r. {: J& K3 K1 p
, I6 o. {, m. h
std::generate(vec2.begin(), vec2.end(), []() {+ B/ q$ a4 y! B0 L
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
" |: B+ ]- @ l' T6 `% } });
9 x6 G( r) Q. j3 O+ p& F4 C( Q* L( ]/ w. A3 b" S
for (size_t jj = 0; jj < vec1.size(); jj++)
7 H, a9 A$ c) V1 B$ w7 Y @7 ~ {
: h( G( S; E2 U3 @$ ?2 z+ ? b1[jj] = vec1[jj];/ f3 n5 ^! c7 _ E7 c
}/ H- V9 V; ]; \" F' E5 m5 o
, G4 k i, Q( w0 @" ~ I* b
for (size_t jj = 0; jj < vec2.size(); jj++)
0 Y$ k& m/ c3 I/ k6 Z& j/ [/ p! w4 ] { q# \, l$ S- ~' f5 b
b2[jj] = vec2[jj];
L1 R$ \3 p, m) f. J }' G0 i0 i0 z, N' j. d
/ c) }3 Y+ x8 Y G5 f //Method - 1 N=100000 247s
1 H2 W( u4 j7 l$ c; P //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);% j: V* J% Q z+ y* m; [- h
8 g: n: K8 s" a7 p' s, p% z
//Method - 2 N=100000 237s0 X/ _( w+ B6 g" O5 L3 }! p/ B
/*$ O9 b( A4 h" ^, b7 u8 _- v3 ?! L
for (int jj = 0; jj < N ; jj++), ]$ _8 b$ Z$ |( Q8 e4 h9 D9 r; n
{
* I1 u& y6 B% S6 z5 @ fresult += vec1[jj] * vec2[jj];
. i9 r: R, ~0 A. v }; P3 Q W1 j& q) t
*/
( g* n8 ~" K! U0 H/ E l; E $ I) R0 I+ j2 x7 P# a0 o+ Z
//Method - 3 N=100000 204s4 R' Y0 L3 A2 T3 C# b
/*
$ W6 {3 V2 T' a* o$ W8 J0 T @ for (int jj = 0; jj < N; jj++)
! r6 F/ L6 V7 r* \( t! o {
8 B" x) u/ L S/ v9 a1 x fresult += b1[jj] * b2[jj];
4 B# t6 Z+ @' d }; ]6 U, @0 l* S: n
*/! }9 D3 j; k9 P/ a6 H/ k m# f5 @
. V. R* X9 n. b+ b( t
//Method - 4 202s5 \6 l9 e$ ?% O0 V9 A; z
/*, x" [; O7 K' O6 H5 M! y8 O' u
for (int jj = 0; jj < N; jj++)
" ^1 A5 }) ^/ H1 I {+ S9 T6 T, Z9 ^' M9 }
" ? [1 o a" j) q. f+ V0 p }
& o; o% Y R/ Y0 z% @" ^ */4 D+ D: v; q! P5 t3 w
//comment out all methods, N=100000 202s 8 M% A4 A. w# P4 E; h. l
}7 j# ?) i" T& T2 M. w6 V
/ {. K* Q3 Z( t& p9 k$ z& e
delete []b1;
4 {2 z8 D8 S) @9 e) [6 Q delete []b2; 7 K5 V M5 g I) V1 v# r
|
|