TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
5 E( S+ m8 p" e* w w. ?; ^+ v, {& p& ?( e
理了理思路,重新做了一个测试。$ C% ?8 ?" d8 t: N0 D6 ]# k
做了两个 vector 和 两个 float *, 都长 1000006 l" {& `5 ^! {4 A# ^
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.1 U) f9 a X: L, E) U6 v/ I
2 M5 a- E; u( a( c5 C: L
内循环试了4种方法,
7 x7 b2 M r" B N: O- W: c1. 直接调用 vector inner_product 247s
; E2 G5 H1 P& M d. }2. vector 循环点乘累加 237s: t1 G4 J* c9 Y: {( q
3. float * 循环点乘累加 204s: p. O) a6 w. [: I% Z- f. L7 \
4. 空循环 100000 次 202s
- \( }9 { L o4 I; }# L/ ^/ U( _. R4 p& G; ]
不做内循环 200s
( d4 t2 J& l i# P) i- a' n5 S7 \; n- ]7 g+ d5 \! ~3 F: l6 N
你昨天说的对,内循环本身占比是很小的,大头在其他处理。8 n3 e& C5 a! e/ n9 { T! O% g: u
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
, z; h" R# l, K# d, K8 H7 q5 u0 e; z E0 Z
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)# X5 i: G) _: U1 s/ j6 Z
% O- I1 U m$ }3 N8 \; Y(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)4 g1 ^" a9 T4 P
: w4 F- W% w# k! c5 | std::vector < float > vec1(N);1 C" B# s9 H7 E8 d! Y4 s+ R+ ?/ g
std::vector < float > vec2(N);3 @+ B! g/ w0 M+ w
float* b1 = new float[N];! d4 a" r2 {4 C3 u! k/ t. w. Z
float* b2 = new float[N];
4 I) i! L h* c* O/ [
+ a1 q% [+ B. ~6 v+ j0 u for (int j = 0; j < 6000; j++)
3 i3 V9 ?- P; D% x9 R {" D: J- _5 Z3 J1 y" I) D/ U
std::generate(vec1.begin(), vec1.end(), []() {) w7 m. M- C" z
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;2 ^( B, {, K$ c6 @% q0 n
});$ A% Z+ D. s( I [5 R( a# }
: L w! m) ]$ L: `; K std::generate(vec2.begin(), vec2.end(), []() {
. _" r( a1 \* {9 s/ X5 D( r! \ return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
' E( n: V3 g! S3 ?+ Y8 s }); |" |/ N! t* |6 g4 G- G# W
, w* d0 M& i x+ g
for (size_t jj = 0; jj < vec1.size(); jj++)+ ?% ?' y9 U u. c" w
{# i# {2 G* t8 }; y% R& F: }
b1[jj] = vec1[jj];
9 w4 V, c9 O: K# Z3 L; D }
- I% h3 P( c! D! |; h0 {
" u4 c! C8 a% k( i# K for (size_t jj = 0; jj < vec2.size(); jj++)( v( z& w( l @. s) ~
{0 @+ n! U) A; i M; h& s
b2[jj] = vec2[jj];6 j2 z* d4 ~! T3 n: P! n- i1 B* i
}; F" r+ x4 I5 V7 _; T3 y
- B( c4 D- {0 T$ y+ i: p# w9 w //Method - 1 N=100000 247s % s8 y' u D5 M
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
" C7 g6 | b3 _+ ]4 j% S1 M P
) I+ j# c# J2 O, T& D! ^4 u7 m //Method - 2 N=100000 237s
4 b, I6 x" l5 Q4 s) ]7 y /* t5 S1 o6 u$ T8 t
for (int jj = 0; jj < N ; jj++)
0 |: @4 b4 @ Z {
0 i* M8 e) @3 f& l fresult += vec1[jj] * vec2[jj];5 \& ? I2 s; j9 t: j& n5 K
}
- O& w$ C5 s& L% s4 ^% s# f */# j; f0 H3 r, l
# ?5 W4 a& v1 Y+ W5 R' j
//Method - 3 N=100000 204s% T @7 M. F9 `# t2 G
/*' k- P& Z8 ~, d: G# c
for (int jj = 0; jj < N; jj++)
7 x) t" x# H( L! Q; ^9 } t {
) h+ k$ Z: C4 U$ g fresult += b1[jj] * b2[jj];
- X3 q, C6 O! ~, d" | }
, |6 m+ b- W1 g* `! g/ l */7 m+ Z/ n Q/ ~- V5 R: @- M0 ^
! J3 ]& _, `5 U, y2 V. W, m3 g //Method - 4 202s
6 h1 i$ P5 l+ e' R4 Q+ x /*
3 a! Z; u! L! e+ f5 S for (int jj = 0; jj < N; jj++)- H2 k" Y, W u0 J9 ~% B
{* p0 T/ c3 @! `0 J2 c
: F5 @* h& s3 V$ l1 D/ u6 S* m4 M
}
O- A6 m$ P$ n1 J2 F- U! s */
0 U% c9 n, e( j2 m2 b# S9 v //comment out all methods, N=100000 202s , B5 _% I1 m8 e% h+ u& J5 f
}
! y! N1 F$ k J
/ I2 ^6 O3 P" }7 F D3 n, Y; K& m+ V& n* k delete []b1;
" N9 i! w' D. ] delete []b2; i, I! w. g% j9 [" c4 E
|
|