TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 6 L9 w3 D* \6 s1 G. p, e" F
) [+ A: d* U- j D- N理了理思路,重新做了一个测试。; ?2 B* b2 B( X; i
做了两个 vector 和 两个 float *, 都长 1000004 p. U" d$ F0 @; g# _
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
+ P" n% C* Z3 y* K+ r+ m) f- e, `- Y$ [8 w
内循环试了4种方法,
1 A* @( _. z1 f2 s1. 直接调用 vector inner_product 247s 6 \0 e3 h2 {5 d
2. vector 循环点乘累加 237s: T5 K! y) {: y9 {
3. float * 循环点乘累加 204s5 ?6 u- y/ a$ Y
4. 空循环 100000 次 202s7 t' O+ e# N; s0 Z
- L, ]! F Z/ A+ L
不做内循环 200s
+ M2 H; p: P& T; g: P3 p- ^
8 K& P3 ]' [# Z; S; {( k你昨天说的对,内循环本身占比是很小的,大头在其他处理。
' {$ P" U* B& s! ^另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。9 S# b" k! S# N, ?7 T9 L# B
% c) g) J% Q, e3 f' v' N$ b
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)! s' q% y: I/ M
. N, a0 u6 a" b# ~( d2 V+ @(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
7 Z$ N2 L* E, \; b+ `* v
1 h8 e; i1 W3 v9 c% q4 M2 I std::vector < float > vec1(N);
# I; s3 V. v: J4 W* a1 A std::vector < float > vec2(N);
0 b3 F0 l2 c* W* G# W float* b1 = new float[N];5 J: I! m! ]8 N# u: h0 a$ S
float* b2 = new float[N];
- w, ~0 P$ p3 R* ~& A- k+ G
2 ?0 x2 S) C1 s7 M# I for (int j = 0; j < 6000; j++)+ @5 Y E6 T# a$ y9 M
{+ l \+ j" V8 I u; f
std::generate(vec1.begin(), vec1.end(), []() {
$ F4 L( R/ o( p. F* R# Z- a return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
& X# R$ Y$ L) a3 L( m });
. v3 N8 q- N( k
4 }5 x6 |) D* n- J std::generate(vec2.begin(), vec2.end(), []() {
5 S' _, h& p- P" R4 a return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
! H4 R; Y$ u+ V/ u, T8 T9 f });. |5 ~, w) p9 ^+ H6 z Q* ~, f
8 I, b1 S. M4 e9 z+ M for (size_t jj = 0; jj < vec1.size(); jj++)
, e% G0 h# A' Q! K {
2 @8 q! R* J9 X4 M b1[jj] = vec1[jj];3 m, B4 m0 g( C7 k1 w6 z1 x
}
3 N3 b4 N( b2 p* J) ?+ u% j8 W, A" c5 B/ U7 R% l# p9 t7 y! N$ i
for (size_t jj = 0; jj < vec2.size(); jj++)
2 x" H% R9 ^6 {( M {- J! a; e$ C A4 J* s5 {* X
b2[jj] = vec2[jj];
; N3 x* S& m- T2 E: K }) N7 q9 c/ v3 y( Q9 V+ r
7 U- w/ I; L0 c8 c; }* p
//Method - 1 N=100000 247s
! X: ~7 m* G9 Z7 L //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);1 c& V1 X' P. W+ R5 o# e
9 L5 Q' ^) F( M- L2 q //Method - 2 N=100000 237s3 j2 z0 ~& o# Q8 _
/*
% B2 Z+ J. S' k+ `- {4 t for (int jj = 0; jj < N ; jj++)
3 d' g4 X& Z( V0 P# V5 M {0 D; f n+ m% K( Y- I
fresult += vec1[jj] * vec2[jj];
* y- _ s/ e8 J' { }! ^/ @5 F. O% D
*/4 L. e, M6 Z5 F
% L4 u8 F3 X: k& p) F2 |# Z: o //Method - 3 N=100000 204s
( Z5 C9 ?9 [# ~6 g0 {/ c /*: M T9 ^' O# z; L
for (int jj = 0; jj < N; jj++)
/ [5 g2 f9 J' G, w {/ M2 c% `0 K w8 @8 p1 q
fresult += b1[jj] * b2[jj]; {+ Q' U2 k$ R% i& e- c; o
}; {4 h4 ^9 z0 y% A0 T7 D% d/ Y
*/- u7 J! |5 T& F+ l$ K/ B
% \4 U3 I5 n: a: K" K, ^
//Method - 4 202s
: g4 @: E: Y! P" U A0 [ /*
0 }) D. D4 e: S7 |* ^# z" N0 G for (int jj = 0; jj < N; jj++)
( u) k/ L c% l7 L {- t1 T& ^5 ?! w2 v) f3 z0 Y3 x
, @& e6 H7 K3 h9 M5 c
}, c# g8 g$ V c* u/ @
*/
9 C7 Z) }: m9 Q0 ?0 `! C( E //comment out all methods, N=100000 202s 9 ^7 E) A) K+ f( ?8 d
} s; k3 n% C$ u& n/ ^
, P! V- b& K) d& m! m& }, r- w J4 @ delete []b1;" T3 f; H$ _$ u6 M4 v8 F
delete []b2; [: K0 o6 K! L- G
|
|