TA的每日心情 | 奋斗 2024-3-29 05:09 |
---|
签到天数: 1180 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 7 [& E, x, P$ i Q: W' ?& u
9 A$ L" i$ B" n' D7 F# p @
理了理思路,重新做了一个测试。/ v; |( m9 Z% e" E/ R6 {& z" f( w, \
做了两个 vector 和 两个 float *, 都长 100000( i# a" H: L, }$ y7 w' ~' ^, m* R: ~' ^
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.& _ o9 _0 T$ q1 w
4 Q% J0 r6 C) v" n( N$ O
内循环试了4种方法,
" n4 `4 F, c; ?: ?1. 直接调用 vector inner_product 247s 4 l" \" D! w5 f# n, [
2. vector 循环点乘累加 237s0 @0 S% g8 t9 F0 n. f
3. float * 循环点乘累加 204s, W6 o, z5 Q5 V3 ^2 {) p, b
4. 空循环 100000 次 202s
, f- d/ f- \( R( C1 l% e
* N, E$ G. f( n; d不做内循环 200s
" a1 A G- O/ e: v( k; k1 a* ^) ~3 m7 B; a$ C7 P0 M3 v
你昨天说的对,内循环本身占比是很小的,大头在其他处理。* d! k- h- x8 \
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。2 J8 P6 u$ u9 W( q
+ S0 L$ B$ f' b1 r% M- R/ I* v
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)0 b9 n& t2 g0 ]; L# X- H- x: X) Z
7 Y: F" W- i* k# d' D9 ~9 o' W
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)7 m1 W4 k+ A* Y" U. k/ z
4 [; c/ @; v/ _
std::vector < float > vec1(N);% Z. a3 ~0 P1 K9 L$ p
std::vector < float > vec2(N);, m( U2 e1 L5 ?9 w5 y, L; y
float* b1 = new float[N];
1 A" E/ t% A2 j2 _ float* b2 = new float[N];0 O m% e. C# w8 F/ D' i
! E# Z# L2 J( _2 x* u5 T
for (int j = 0; j < 6000; j++)
- |+ L O' v$ W! q6 E. B. Z Y {- f6 Y9 k8 L+ L8 t
std::generate(vec1.begin(), vec1.end(), []() {
+ F' k! [( z" O4 I1 z" \% I& k return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
3 g& ]6 m6 M5 W$ u: c });3 D1 g0 d) O E" ]. O1 l. G
* t2 t2 e7 p& b
std::generate(vec2.begin(), vec2.end(), []() {
% ~# m% i0 g3 o J9 p return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
( L: B" v/ ^) I4 p* C });
7 o. u& D5 l4 a5 Z
# z0 E; }0 c6 v( T for (size_t jj = 0; jj < vec1.size(); jj++)7 X$ A8 Z: s' u) x! s7 |
{5 e% t1 @- k7 u/ K
b1[jj] = vec1[jj];' _; r) b( n- q( k
}3 R( b5 Y3 w0 D
% h. Z. W2 j+ | C8 k for (size_t jj = 0; jj < vec2.size(); jj++)0 e; o! X' |1 t# e4 b8 H' _( w+ d
{
0 C A* Y/ P5 s U b2[jj] = vec2[jj];
3 ~# d" b) h9 r: G1 x; y* T }+ h$ T, o: V4 w3 p( V/ J( p% C
! m* k7 d% O9 z! L //Method - 1 N=100000 247s
+ t. O6 Z) e" P6 ^: |6 J( k //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);$ h# G, i7 T( h, k) U. H5 w
- ?6 T% i6 h* z2 L$ {$ `; k& ` //Method - 2 N=100000 237s
2 L* D+ V! H7 `7 o# c0 Z /*
4 g, u# N% X5 ]3 ?% W; C for (int jj = 0; jj < N ; jj++)
; y* N6 x- P* g% S, A8 j d {
D4 Y# ~# [6 t# o fresult += vec1[jj] * vec2[jj];4 Z! u& b. X2 ]4 L8 Y& f
}+ U# R* I+ K$ W7 I" `% M
*/' Y8 e; j5 O! h2 I& i( e
$ O, A9 p, g* J. B' m; d
//Method - 3 N=100000 204s
8 M3 F% X: m" J /*% R% \/ d( q: H @" C1 r3 @& \
for (int jj = 0; jj < N; jj++)
- K; x9 B% ~6 U {
' @5 p8 f' V) s# j. q fresult += b1[jj] * b2[jj];
' p: d% B0 }7 g$ `) c2 P Z. r9 V }2 ^5 `9 W2 Q9 \& }
*/, x& K: L2 i3 h3 b
4 r: G- e, w8 e //Method - 4 202s
' C7 X& `* s, x /*# G# E3 O& O2 R: `4 O5 w
for (int jj = 0; jj < N; jj++)
4 v6 \/ s* V! q _" [ {
- t" r( S/ {* M' ]9 e+ f* Y2 U- f
P( ]% i9 p9 P }
R( G+ t2 e/ r& k" g' @ */! c4 i6 R( }* S# A+ O& \4 O3 E
//comment out all methods, N=100000 202s $ w0 Y8 _1 k. M* u
}5 y, S" _+ k- w& d5 d4 O5 M
& U# Q. l g( z/ p# V5 \6 k, P2 D delete []b1;2 C6 x. X( l3 U# L9 B+ K6 V
delete []b2;
4 w( M3 k/ e l/ _' r( p |
|