TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 ) o. @% m) \0 g/ u* l! c8 M
' \/ D7 s) T. W8 c& ^9 d; s
理了理思路,重新做了一个测试。& }6 @& p4 f. b# L0 f6 {
做了两个 vector 和 两个 float *, 都长 100000
4 Z# q$ j/ }2 B( D外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
- B* ~: V" t) z) s# z- x2 U+ r7 p9 p2 E, }
内循环试了4种方法,
/ B6 C/ E: i5 v3 C) N' l, R( v1. 直接调用 vector inner_product 247s 4 l0 p( ]2 u5 _' B5 ~% N( @
2. vector 循环点乘累加 237s0 H2 A8 k( {" Q: N
3. float * 循环点乘累加 204s
$ i0 i: p |6 W- h. B" m; f4. 空循环 100000 次 202s/ j9 |, q. `8 ?6 C: I( u
' u0 c0 R C" @4 J不做内循环 200s3 ]$ \* p0 R8 L y
( w' [; ]8 a: Y0 |" y; n你昨天说的对,内循环本身占比是很小的,大头在其他处理。
( P) a1 ~2 V9 W3 R, j" w+ Z另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
2 ?8 y: r: I+ S$ |* z# U. ?
+ N. L9 B+ z' ^- s至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
& K4 s, T' }. Q% k8 V' {
1 v, N& @3 W! n7 T(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
; }/ P$ g8 t0 x' }- L% N+ j7 J3 t' B+ a( K9 K& G7 ^! M
std::vector < float > vec1(N);
- v# S. g+ h9 Q8 O5 B std::vector < float > vec2(N);6 {+ T& ?$ X8 w- H
float* b1 = new float[N];# J% T; K, K( `/ H. m
float* b2 = new float[N];
& U! Z6 r0 N2 X9 n# J* m5 E3 w" v3 D' Y- k8 z3 x% s
for (int j = 0; j < 6000; j++), }7 R: Y/ A2 I" U) O$ I e
{
7 [; @ S, J. M; I std::generate(vec1.begin(), vec1.end(), []() {/ @; }4 @: M' ^% S6 c5 V
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;" Y, M j$ t, n& T9 S
});3 Y, Z) _/ L' F! B% v Q
* V, z3 w! A7 h4 h4 R std::generate(vec2.begin(), vec2.end(), []() {5 X T5 Y8 I5 A4 \% t
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;! |2 B8 y6 q3 e, O7 i' l
});
; w, X4 @' N) n* L. [$ x5 K! L. W. d$ z
for (size_t jj = 0; jj < vec1.size(); jj++)/ \5 @ k9 [# F8 b7 v! t3 l
{
( n2 z5 K, i/ y) h& U b1[jj] = vec1[jj];
+ J: r+ [7 f6 S, o- t1 R }$ n% o, Q% \& n# @$ [. J( A% v. z
2 _" g/ w/ L3 {3 m
for (size_t jj = 0; jj < vec2.size(); jj++)+ z' l0 r! x; e7 A+ D
{
y6 M, Q; J+ Y5 _8 h+ V: m b2[jj] = vec2[jj];
- m* p7 Q" @( M. Y; Y( I3 u" [ }4 u* |+ b8 {- D/ Y
& k7 Q+ Y, z/ d6 |1 _* X' o5 \9 T //Method - 1 N=100000 247s : _) `5 Q) w4 s$ {4 w& Z1 `
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
1 u3 O% {- W0 O9 Q) j
' c2 z/ M$ U( v! g6 [: ^) v0 M //Method - 2 N=100000 237s2 }* N$ {, f4 B: h1 M7 `$ i
/** ~6 q) N5 Y1 S# J8 y) n1 N* E& t& V
for (int jj = 0; jj < N ; jj++)
( O4 Z" k/ L- s6 A; A6 D! v1 i {
' P* r: o, m. S0 n# O fresult += vec1[jj] * vec2[jj];
5 X+ _$ w" z4 L r# u: T% p/ Y/ E }
: Q* G+ Z, y* ^# i- k/ R; { */
6 Q7 v2 _7 y8 f4 r1 z : h4 l, F/ @' G1 ]3 v* e8 T y
//Method - 3 N=100000 204s, n5 K' D( z9 S$ `# [$ T
/*
0 @2 l0 V: b4 a2 i8 G for (int jj = 0; jj < N; jj++)
* |8 b. n- M) L$ f5 Z9 j {$ F0 f9 g% Z$ f7 p% v
fresult += b1[jj] * b2[jj];
4 f, M' U+ i9 y+ T5 [& d }
& T, a' @- a( S4 |) d. O */0 F% M- b0 ?1 L. T
1 e' q2 f2 D, p( e$ I
//Method - 4 202s7 x! B4 u# y* j1 s! f
/* o" g4 Q1 J6 q8 w. {
for (int jj = 0; jj < N; jj++). ~. R* X/ |! Z M2 W
{3 Q+ u/ b# T( b1 Q7 T. ]
& t" p0 O( L$ u' p }
2 Z* D, W& i+ ~- V# ~' `3 ? */" h6 M/ M. @) [0 {, C) N8 F
//comment out all methods, N=100000 202s
; @" k* ]8 ^1 y/ i8 `; o }4 s+ i9 c6 |# l2 n. h8 r8 N
' a% _9 B6 q0 C
delete []b1;! j6 \+ t+ X: e9 i4 ?8 ^0 I
delete []b2;
" l! \( v' a* Y2 J5 A( x; O |
|