TA的每日心情![](source/plugin/dsu_paulsign/img/emot/fd.gif) | 奋斗 2024-3-29 05:09 |
---|
签到天数: 1180 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
& j# m' u1 S0 g5 l3 \" Q9 ]& U: H
9 f+ y; S( a7 p$ b% \0 g理了理思路,重新做了一个测试。
D6 A- V$ B9 y4 h' d' f% g2 q0 J做了两个 vector 和 两个 float *, 都长 100000( j% P& h7 p: Y' I4 a
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
/ t# j" ]' I. N
/ l: A+ y) ]% T( w' |9 F- X内循环试了4种方法,- i& g+ Z1 ` }$ g% T5 l5 g
1. 直接调用 vector inner_product 247s 6 Q. B% \" G" X3 ~% ^
2. vector 循环点乘累加 237s
2 N, o! C- Y9 v3. float * 循环点乘累加 204s
+ _7 a5 ?& P2 R, A; R& c# }4. 空循环 100000 次 202s
6 Y% }0 Y1 x E5 w" Z
1 N* ^, Z* [7 k' U不做内循环 200s, t+ ^8 Q# U# F1 L3 k4 ~/ Y
5 K% j, h9 a: X2 d/ B0 ?; C* F
你昨天说的对,内循环本身占比是很小的,大头在其他处理。( K) _( s7 o0 e( H' ?, b
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
" M( G6 }; Q# x; O. J+ @. @
, ~& {7 o6 B. o至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
3 w0 b: `2 n+ r8 Z0 p& M5 W. ?1 T! S
. W$ Y8 o1 c* ]# }; a(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL); r2 h2 s( n5 U3 v" z
; v8 x0 m' w1 H6 q7 G3 c5 B std::vector < float > vec1(N);
- T2 o% f4 m$ X* |0 o; q7 { std::vector < float > vec2(N);( q9 p' G' ]5 ]
float* b1 = new float[N];3 ]- s' ~- ^) `0 e6 H7 {
float* b2 = new float[N];+ j! J& n/ R: I# ?# \6 }
M) D! t" u' m! l6 W0 O( L for (int j = 0; j < 6000; j++)
2 q5 N! S1 P1 C {3 O: l8 ~% L6 `: Z- K
std::generate(vec1.begin(), vec1.end(), []() {
+ `$ I) n" F+ c: \3 w return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;* K! p( E; o! c+ V: I
});
/ z* g& v3 _4 _0 O$ b: k4 }9 Q- b# b: [. [
std::generate(vec2.begin(), vec2.end(), []() {; c1 H* K; \! M! L- m w# W$ h
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;* X7 ^1 O$ K8 W9 R9 Y
});3 ]5 Y: ]% g. F
. [ @) B9 K! Y2 t for (size_t jj = 0; jj < vec1.size(); jj++)" Q( I2 G. H B, E' P
{
5 q: Q7 W4 h- _$ Y8 u" W b1[jj] = vec1[jj];6 i) q3 t% f* n u. E- o2 R; Y
}( h+ `; ]- x7 E. t6 A
0 \& t5 O; r0 q3 ]# t5 @
for (size_t jj = 0; jj < vec2.size(); jj++)
8 D# y: i+ m& n. h8 B& U, V) a6 T( ? {& p- y! _9 I# Z1 ]
b2[jj] = vec2[jj]; o* C- P3 [+ b8 k' d
}
6 |; E, |) |; y9 Q' O+ m5 M+ v
h/ r; F/ s& ?( A$ V5 F& y! S //Method - 1 N=100000 247s 2 W) S: @% w& c* y, D; O
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
% Q9 L& s( R+ u# W. x+ I7 L$ Y 2 l) M/ d& {, \4 _
//Method - 2 N=100000 237s
/ n" Z9 i9 F0 ^: v% N /*
1 D& c7 M7 c( h( Y+ i, o; P6 B7 h+ G for (int jj = 0; jj < N ; jj++) o: l( i. `: f4 a4 q) K
{
! W, n3 a) h, u/ O p; T fresult += vec1[jj] * vec2[jj];
1 p; ~3 W o& U. x. y }
+ p$ f2 }: j' t4 r) d6 p0 }! Y3 S/ \; L */3 E4 G7 `5 S6 u2 b
, w4 _" l6 d1 b* T0 Z/ f //Method - 3 N=100000 204s% |+ b2 z4 ^0 t& i F. J- B
/*1 ^! B% O, M1 L& K
for (int jj = 0; jj < N; jj++)
% K' \" K1 C6 ^ X0 v {; B& E9 H; ~. u. u3 ^+ K7 O
fresult += b1[jj] * b2[jj];
* l) y9 q0 L3 |1 S% ~# w, z }0 G5 W! a9 R% U% o
*/( u6 I$ D; K, q
5 G5 u1 [* n' V5 k% i
//Method - 4 202s6 V* P! \& Z- _4 U2 ~" ^
/*
% z) C$ C, l! ^7 {; f- w for (int jj = 0; jj < N; jj++)
, Z7 x2 M. X/ h4 [% \8 `3 j) l' y+ c {
' _& T4 @/ |$ Z) N! J3 q' L1 x' Y + I- ]2 M' k3 z4 P5 d
}/ q. a5 S% D5 G# H
*/
p' b" o, [0 ]7 P" w //comment out all methods, N=100000 202s * Z- C9 H; ^$ u' r
}
# M; ]" P3 s4 o% M" [/ m" ]1 {% b" K2 [2 k, P0 l! Y/ }/ o
delete []b1;
9 w) M' j4 X' `( o delete []b2;
! F/ \$ v+ X6 _! w |
|