TA的每日心情 | 奋斗 2024-3-29 05:09 |
---|
签到天数: 1180 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
, ~$ }. g2 V3 q2 u7 [4 ?6 v; b6 r. [
' {- {/ R1 @1 `% {) Z7 x$ U" c理了理思路,重新做了一个测试。
9 t- _" d5 Y0 r$ K/ o做了两个 vector 和 两个 float *, 都长 100000
9 d4 H; s* z2 m) p k/ V外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.$ w# Q' Q6 G: q, T
6 x# \7 T8 {9 w/ W* Q内循环试了4种方法,7 L( d/ e' g9 M" W4 z4 y4 I: c
1. 直接调用 vector inner_product 247s
5 X8 J: u0 w6 ], r% m2. vector 循环点乘累加 237s* ?' H3 n' Y" U, P2 l$ x
3. float * 循环点乘累加 204s3 ^6 S8 Q h0 O" y0 P8 U; H( O6 {
4. 空循环 100000 次 202s
" }6 `( ?1 Y: n4 n( _4 @! j( I- b2 F- G, ~; v" Z* }# e) L
不做内循环 200s3 Y& M6 P; c4 X5 {9 y& I& Y. Q
; Y. G q# z% }
你昨天说的对,内循环本身占比是很小的,大头在其他处理。7 f3 K2 V, K' }. n% @+ a& [
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
" T. ~% v$ M9 O- Q
) @; T6 i. s6 u' ~至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)9 G7 |1 @5 e. D0 W
; B& @* H) d2 _9 A) V& {(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)( ~: Q, R( z }
N5 B9 ~+ T# o std::vector < float > vec1(N);3 h+ n& m' h) i7 L e# `5 Z
std::vector < float > vec2(N);
* b! F- i4 ^+ c5 `# c float* b1 = new float[N];
# t3 p" g1 G9 Q) w/ M7 e! [ float* b2 = new float[N];% x, Y D8 b, a8 w7 c
6 ?2 s( Q5 ?' q* a
for (int j = 0; j < 6000; j++)
, C7 P- [' T3 A {+ s/ N7 V# z# f; X
std::generate(vec1.begin(), vec1.end(), []() {4 j! o4 Q! n) d: }8 ?! m |# M
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;5 m# | Y" b+ Z5 r5 e( `
});' J9 Y v3 L8 |8 O- r% G
* P1 a8 M! B6 v- _8 r, D& e7 Z std::generate(vec2.begin(), vec2.end(), []() {
: Y* K _! \, h" b1 a return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
5 O' U( P) c9 g( B, k3 [) a0 g! Z });
' Q) ~7 e* j4 M; c! S. h) i9 o
% J; @( ?4 k0 S% d. |3 c) { for (size_t jj = 0; jj < vec1.size(); jj++)4 d3 j, [0 j1 b$ u' o8 G
{
2 x2 ~8 Z7 A$ L b1[jj] = vec1[jj];3 }; N) M" j& j, J9 @3 ?2 T8 L1 |; M
}+ ^6 h" ]; H/ X9 b) V
, S, }$ r0 ^; v% ?: p Q
for (size_t jj = 0; jj < vec2.size(); jj++)
: f' I; d8 F& j( d {
3 c; D/ I9 k" @# x. v( H, }8 h: p! [+ @ b2[jj] = vec2[jj];
8 x; p, _. u3 }+ j3 X$ R6 ^ }4 \* q6 C: V% r- p' d$ B
2 A/ _4 f t, J/ \ l3 U
//Method - 1 N=100000 247s
% n$ h* K6 e5 }3 ]: ~; C9 l //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);! \: @' c1 s; B* F6 r
! j. `% j. ^' r' b$ L% I6 x F7 ~
//Method - 2 N=100000 237s! j$ c( O6 s% ^: R w- f$ V
/*
1 k0 N; j0 N# o9 n. k9 V4 V; y for (int jj = 0; jj < N ; jj++) X6 O- u* ~5 }9 f/ J5 L0 P7 g0 T
{( e6 S7 f0 d1 A
fresult += vec1[jj] * vec2[jj];
! w& ~9 ~( o" c, ]: v. y: j }
, K' B2 D5 s/ f */, S. v& m" b0 I' H
7 r% B/ x, D. X0 E1 h
//Method - 3 N=100000 204s7 n0 J& _! P8 s% d; @
/*
* j6 O( e) u x$ g for (int jj = 0; jj < N; jj++)
+ `2 X9 b+ K' b, t" u {3 ~) B- S" ?3 {. Q) j/ z/ \0 M
fresult += b1[jj] * b2[jj];0 p% H w. z+ v+ \# W6 \8 ]
}5 A5 C: a; O$ g4 \ b
*/) b) D) g% o. E$ L
) V' o3 N; l3 v: p
//Method - 4 202s/ p- T1 ~2 \* }' E3 k
/*
7 R) U s& ?$ T! Q for (int jj = 0; jj < N; jj++)6 L: g) W A+ I S' }1 r5 h
{8 t# k+ N' b7 W4 @
# ]; d+ m" w' V
}
) k6 e+ S4 G# m9 B. s j( n6 i( b */" d# R4 ^# i" k- ?3 k0 j) g
//comment out all methods, N=100000 202s
4 G# A+ a. |# q5 U }; t0 S n2 d- s$ ]- P
: A4 j9 l4 R9 o# T
delete []b1;
# ^, [% i, D) ~9 N" W" \ delete []b2;
' s i' ]+ f& Q, N |
|