TA的每日心情 | 奋斗 2024-3-29 05:09 |
---|
签到天数: 1180 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 ! f2 n' s$ [; o8 s
% }5 o( `5 C3 u% R5 ~6 }5 y5 H理了理思路,重新做了一个测试。8 ^ a7 ~: r- Q( f: \: [9 @! \2 `
做了两个 vector 和 两个 float *, 都长 100000
9 {: h& u) ?/ z1 F外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.& f3 ~, }6 j+ d. T; x& K
, W- N; B) g6 _3 Y+ y! i内循环试了4种方法,
5 m* [4 l. G$ |$ U7 M" w4 x1. 直接调用 vector inner_product 247s 1 z3 `' l, n& [( n( Y
2. vector 循环点乘累加 237s6 g' D; l$ _) h9 n# {" t2 r0 }2 p
3. float * 循环点乘累加 204s
' d7 `, X+ N& U4 ^% @# r1 i& ~% b: k4. 空循环 100000 次 202s
) b1 q# |. ~% A5 Q
% ?" M c% w J, ^不做内循环 200s
0 D& j; U) F) C3 n3 L5 [
0 r/ Q& x4 P" x1 M; H% r/ s你昨天说的对,内循环本身占比是很小的,大头在其他处理。7 I/ c, Q' \$ N' `
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
& T& c0 z" m( {! T- S' w2 c8 w4 ~/ C' ]
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
. P! `- Z0 c# V# V* E5 w% ]6 K0 |& V/ n
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL), h- k$ u( A. I* K5 k
b9 }2 L! {, k
std::vector < float > vec1(N);
( R5 m/ o7 T5 r: X& }( O std::vector < float > vec2(N);
' g! j Q) ^6 K( r float* b1 = new float[N];
8 t6 ^9 s+ r0 W7 b' x. ?# V7 `0 s float* b2 = new float[N];
' K% q9 c8 [! D0 d6 ?
! k2 k/ j2 O, _! } for (int j = 0; j < 6000; j++). }/ Y1 U3 Z# L# w0 ]- i# N- |
{
) K9 p) k s i& ~ std::generate(vec1.begin(), vec1.end(), []() {# X" K" _# ]& V5 `* K% d
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;2 d5 b: K& V; y9 T- x
});
2 y. Q6 r2 [+ @* j1 K1 x, B6 ~# D6 b: b* Q2 U) W
std::generate(vec2.begin(), vec2.end(), []() {- U4 \/ `0 |8 a6 P
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
4 \: v% ^$ _, T0 n0 q });
2 g) t% K) p2 C- r( O3 i& I+ q3 [" R0 q- X3 ]3 z
for (size_t jj = 0; jj < vec1.size(); jj++)
% R; r) n ~4 g/ y0 l. y {
0 y) I, K1 P F; R2 O b1[jj] = vec1[jj];
6 T2 @( C$ `1 b: \ }
# H% U2 W( R6 H$ f4 J1 x H7 A( n+ h5 P! }/ n
for (size_t jj = 0; jj < vec2.size(); jj++)2 C6 D9 q! Y& B3 d" ?2 e
{+ C4 |9 D* A( o% ?: }* N
b2[jj] = vec2[jj];" K: ^" i7 v2 h8 y
}/ [- o* ?8 n' a! d* j. [ _
4 O6 H) S- S* e# @/ a1 A! C //Method - 1 N=100000 247s
) L7 V) a, |. h4 k. R //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);& b5 L4 Y* Q5 J3 V( X N* g' O. m
6 \) m6 T( e z, ^9 n( w% f5 m
//Method - 2 N=100000 237s) R; l7 n1 K3 ~! ~2 T( v. B
/*, ~5 ]8 q9 k& @ s% D1 s2 z$ M' u0 x
for (int jj = 0; jj < N ; jj++)
+ Y6 ~4 W5 [9 w3 n5 a+ C6 Q1 d {; y* C3 q" B0 z: y
fresult += vec1[jj] * vec2[jj];
) \# v5 i6 q! T F' R6 ?0 l4 D }; q8 ]( v1 c* K, Z
*/2 l4 l: ?, k' V( ^0 m" J
; k2 B. l3 F( r `+ x6 |/ m5 q
//Method - 3 N=100000 204s
* z& a# u+ P8 l* @ /*) s0 {. S8 v# x; m
for (int jj = 0; jj < N; jj++)$ K9 C8 a# W) B, K
{: Q9 }) U4 X0 m5 ?1 j
fresult += b1[jj] * b2[jj];2 m+ S& ^$ }* I U1 I1 b; a
}8 Y3 a7 }; e# o4 K9 H/ U7 Y
*/
* j' n& g( F. P2 ?5 w) J
; y( W/ Z7 r/ g& U% a+ L //Method - 4 202s
! ^6 e$ }0 p9 @) a0 P z /*
: V4 z' Q1 f& ]- p for (int jj = 0; jj < N; jj++)3 S) U/ l! x% W: S; c
{# Y% O3 i9 m# H$ V( i3 r( w- d
2 y; a. h# o o6 M8 E' f, h/ [
}
6 N2 y! X. \/ R, Y! m1 z; I# F */, f& u7 d- O* J8 d# Q5 F% N
//comment out all methods, N=100000 202s
- W7 e4 U# w3 K) D }. J% V3 y, v$ I* Q! T# O
3 `0 e. X O( s) Z0 |
delete []b1;8 i) m; N5 w7 j7 q* U# h" Z
delete []b2; 3 \/ L8 n) a6 [) x N
|
|