TA的每日心情 | 擦汗 2024-9-2 21:30 |
---|
签到天数: 1181 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
4 g( t1 _3 b. z# I. Y' w4 ^( ^* `4 n3 y. \2 s6 |
理了理思路,重新做了一个测试。( W( P6 S0 C3 ~2 J, _% F( ^; ^/ i( q
做了两个 vector 和 两个 float *, 都长 100000( l" n; {6 T! X; `$ `
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
1 f# G: g3 c3 a0 F( m' c" T! B7 P6 ^% R8 i% j
内循环试了4种方法,/ C" y% x! x& u: R' p& i
1. 直接调用 vector inner_product 247s 0 t* @* _* I6 E5 J0 [
2. vector 循环点乘累加 237s' B. U1 z8 U' ^
3. float * 循环点乘累加 204s% S, m) i: F- N9 L$ P) n) U
4. 空循环 100000 次 202s
. G1 D* M S7 q$ F' K3 U
; S' \9 l: S8 D6 C6 D; O不做内循环 200s# s3 @4 k" Z8 `0 g0 E
6 H) z Z0 {3 C; F你昨天说的对,内循环本身占比是很小的,大头在其他处理。# r/ P2 Q) t) u& h/ X# T
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
l' f+ ` U/ y1 X& x$ ~ b
( s$ U1 ~( f& }4 H4 g至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
, ^, T# F. k8 U, e& ]; q/ J0 P. F
h# j6 H$ P0 \(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)1 n7 e4 q8 o( t- V$ s; w! F
) |! {& I8 c& t* y& L
std::vector < float > vec1(N);2 n z' D) b: F, @$ p( _8 o
std::vector < float > vec2(N);
- M% m* m- w* r4 |% d' q1 e float* b1 = new float[N];( L* b) ]: c8 F* D2 e! \" z
float* b2 = new float[N];
+ Q b5 a& [# a( A
& {- A3 [/ w. V, L* `8 q& B for (int j = 0; j < 6000; j++)- R) }% w! P( o& v/ e3 G* t
{/ U$ b0 t7 w# J# B; o
std::generate(vec1.begin(), vec1.end(), []() {
& A1 K- T0 j% x4 e6 f, U/ | return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;1 g- |( v3 i% o
});
5 m9 o. o, K v8 C; M3 p% t) Q- h Z4 F9 x5 c& A
std::generate(vec2.begin(), vec2.end(), []() {; X2 X6 y2 G) y- H) |; j. e' Z/ l
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;0 ~4 H; Z. F% X7 U9 L
});$ u) j6 |! I+ k4 b: Y$ P- i0 a0 z, x
. x- {& Y& |! R f# ~ for (size_t jj = 0; jj < vec1.size(); jj++)
) U" J( i4 J- @: d% X {& Y: P! ^$ Y1 [
b1[jj] = vec1[jj];0 J) u- R- {' Z
}. j2 K; o$ i4 h9 s" M
/ T& a: ~4 A# a+ _ for (size_t jj = 0; jj < vec2.size(); jj++)
% T+ o, V0 W) n2 Z {
! {; g" Z2 W' x9 k& ? H b2[jj] = vec2[jj];
; _0 A. Y) Z! o* H, W) r2 u }9 ]3 s# L& X' @( T
+ B r; r7 i5 L* p5 b& Q* J //Method - 1 N=100000 247s
6 ?4 z4 s4 M) O& G: C //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);/ M* |9 Y$ S9 d0 Y. `
7 H; ~5 I% q9 R4 J
//Method - 2 N=100000 237s, `$ @! e$ |" Q& z6 t3 C$ r
/*! _) g; Z( c9 w+ p: a& p
for (int jj = 0; jj < N ; jj++)
3 p4 v, o6 `5 v( _' n8 J" H3 U/ i {
& Q+ b3 \8 \! z fresult += vec1[jj] * vec2[jj];
# X& Z3 M9 b2 J3 Q1 t }
$ K W9 k& C. [- U: {* p& L */
* j( c, ~% w) b/ V7 P( k- x( q
, ^! k7 Q9 ?' v" z9 N! A6 a //Method - 3 N=100000 204s
Q6 }* Q( D( m /*
; O( D% A1 H) T; V; p. I! C# l# S for (int jj = 0; jj < N; jj++)% @, Z, G' t, m* ^0 K! E. s
{
2 [5 a8 M) ]; P5 G1 e. L fresult += b1[jj] * b2[jj];" Q" v) B6 a& X7 o+ m4 h
}
$ Y. {" l7 T% b0 \; K9 k4 { */
4 H" x Q- r7 Q" \
1 L5 g% k6 y i1 N* Y8 Y //Method - 4 202s
s3 E' x x8 R1 ~& y /*6 j* _. w0 N; w* ~
for (int jj = 0; jj < N; jj++)* h. u" N9 @- b+ L6 @/ B! R$ t
{5 J3 {5 \0 k/ s9 j9 f4 [
' w+ l4 u' V8 n5 N }) O) d' v U& T
*/
* j& R# d% g b+ ^8 C1 k/ f4 H. ~$ d //comment out all methods, N=100000 202s ! P% \3 h* V1 z
}: A2 P- l# V& a% d3 `
+ G1 A1 w8 a* }4 U6 c delete []b1;# \9 P k$ l e: B
delete []b2;
/ T g b8 ?/ ]6 Q2 T$ j |
|