TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 8 o0 F" g1 P, Q
# l5 }5 y: G) E( S" q
理了理思路,重新做了一个测试。1 d3 r( O" u: A( t: p+ m( z
做了两个 vector 和 两个 float *, 都长 100000
1 z% V* @6 I2 I; O/ `外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.( s7 \ A- i& \- K
5 a" C' P* _$ A7 `内循环试了4种方法,9 {+ C7 e2 |8 @# E8 |4 |; r, Z
1. 直接调用 vector inner_product 247s
7 h8 f; S' m3 y# B; t! N2. vector 循环点乘累加 237s
0 s0 Z' [7 K- }9 ^/ o' [5 @3. float * 循环点乘累加 204s
5 w9 \$ y; t& C- x; o% C) b5 T4. 空循环 100000 次 202s
% ?. h6 _ i% [# p
& c7 `# H& x* l不做内循环 200s5 T0 f/ r% [" P4 {' W
, I7 q+ W8 Z ?/ C7 c
你昨天说的对,内循环本身占比是很小的,大头在其他处理。7 q( V3 B/ A1 h4 v% a
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。/ ^# S' r4 Y% v8 i8 I3 }
# D. {' E- }# }至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
' H6 ?: ?% P- [$ i! L2 f
8 O6 L% ?& A3 x(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
- c3 V% a4 T8 |0 J1 K% B+ N4 q# i. g6 L$ n
std::vector < float > vec1(N);
7 c- ]: E1 S# U( @( @ std::vector < float > vec2(N);3 c7 |# v1 Z% i) A0 \& Z
float* b1 = new float[N];
% X+ U! a% _. b5 N float* b2 = new float[N];% ^2 k9 b( X: g' L: {
( W8 I. p/ t7 S( O9 Q' O2 U
for (int j = 0; j < 6000; j++)
8 @; S0 w4 `# m0 e* q {
* d K8 d7 b- R6 U# K2 U std::generate(vec1.begin(), vec1.end(), []() {: A* f9 P) c4 C9 p1 U6 e& v
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));; ^0 S; O5 C$ Q9 D) q0 s _
});
& N9 x& i" v- T" d. y1 i9 Z8 T- V# i# H% @8 d9 F/ H, u9 Q8 H
std::generate(vec2.begin(), vec2.end(), []() {: K2 G, B; G K5 C) C4 o2 J
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;& M j! U; v8 u
});
- }2 V4 s* v7 d7 j. ]* p1 U
, [4 u" K/ S8 E, E9 E" |& N for (size_t jj = 0; jj < vec1.size(); jj++)
5 L8 G# i: C( F' j8 u) V) J5 T {
+ |6 Y! y& S( H6 n) P3 P b1[jj] = vec1[jj];) {+ Z" [" @+ B( M; t6 p' R4 I
}
9 p- x* h+ J; {7 K9 P, E& k9 K2 ^; x' m( a2 \4 d2 R& L' a: |: A
for (size_t jj = 0; jj < vec2.size(); jj++)
( K! J# |& i# q, w! | {
; b; D7 i! G: g5 e b2[jj] = vec2[jj];+ s7 ]& @. o* @! `( [* j1 A
}) J0 E" y, P$ r/ O& o" f% t
8 Y3 p! H( C* B& Z' }$ h6 M/ M //Method - 1 N=100000 247s
3 u5 j, }) D8 W9 M3 ]1 h //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);) D: S- V: `1 j+ M* v+ D' E6 M
% j: x+ E4 _8 P/ w7 c7 _
//Method - 2 N=100000 237s) D3 d2 M2 ?) o1 ?: d4 D! J
/*) ^7 a& L, S: S; q
for (int jj = 0; jj < N ; jj++): J* e. l1 u- ]' i( }6 y
{
. n/ _ }/ U1 R' i3 [9 ~ fresult += vec1[jj] * vec2[jj];% k1 L& D% u$ k/ `, D7 _
}6 J4 ?2 o) j6 ?
*/
* j# E9 Q1 c! d- y9 H0 F3 ? : D/ N9 Q( M0 c8 c- f
//Method - 3 N=100000 204s5 M1 ]/ {* ?1 \2 x3 n: }
/*
+ N' |1 @# C2 o) @ for (int jj = 0; jj < N; jj++)6 t! _* ]. J4 t0 T4 {3 t
{
1 V7 m5 m1 D2 d9 D fresult += b1[jj] * b2[jj];
; ^* a& [9 C; P1 C }
% g4 |1 I2 i* _! z+ ^6 q/ o */
% a9 s% i# `7 f3 I7 g$ ?' F" e& p4 t/ p" k0 \ ]& G& f
//Method - 4 202s
$ E: D3 Y2 s8 M4 M( s0 m /** s2 `9 Q0 a3 l
for (int jj = 0; jj < N; jj++)
& r- N/ }/ o6 [) G$ p {8 b9 C! J2 h3 X3 F& T
" W8 ~4 {" [6 Z' F7 Z3 z c8 N
}
6 E) n3 m7 L9 E! E8 l& k6 F% z+ Z */8 l9 R) f; X6 ]* |+ N! z/ l9 l
//comment out all methods, N=100000 202s 8 N; c& G0 H) p* ~8 [. t+ P6 z$ K
}5 B' V9 b- h. v# K" a9 |6 m' |& ]
) g) _& V2 h, q+ f
delete []b1;6 \! O1 r, e4 K7 B* f
delete []b2;
8 q# \# N0 _1 w' ` |
|