TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 6 ]7 Z) u: j0 R4 F7 f; a" V( f
" \& V; K5 ?- \# L理了理思路,重新做了一个测试。( ~/ }1 c5 r D! x" d$ \
做了两个 vector 和 两个 float *, 都长 100000
, ]; S8 y! z7 @- X* _/ n0 O# k外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
% X3 }6 |. Y% N+ j& d* {# e9 k/ ?- l/ v
内循环试了4种方法,
! [% e* u! ^# h( z9 R. V1. 直接调用 vector inner_product 247s & `# z: I7 z, @
2. vector 循环点乘累加 237s
: N' r7 r. ?+ [4 J- o* R3. float * 循环点乘累加 204s
/ R* R# @, S9 h* k3 y, G4. 空循环 100000 次 202s$ i* Z) u5 Q+ L: x/ Z! L. \$ `
& m' P6 J2 `' W& Y6 \0 F- W不做内循环 200s9 [9 A9 Z* y D7 M3 b3 V! H
: N+ t4 A* }3 }2 e你昨天说的对,内循环本身占比是很小的,大头在其他处理。7 s$ E$ l V& }" O& A0 G6 r
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。9 l/ w h& w8 ^3 ]8 I
. M( v: B2 d* _7 z5 V至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
' ]2 D/ W4 p& G* [/ J- O* k: s4 S* f5 ?- m/ W4 [- X" O
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
% g, s5 T5 S+ R* V: M% @, Y( i
; I( x$ ]! e" [ std::vector < float > vec1(N);, g, K: Y0 P$ T; [( I$ X
std::vector < float > vec2(N);7 T; E5 o# }* R
float* b1 = new float[N];1 V" [& R2 ^; R" z: s3 u
float* b2 = new float[N];
1 `! k, d4 ]& m( q$ o, }4 Y G( r
$ b h; l+ V8 r8 p* w for (int j = 0; j < 6000; j++)* p# ^* ~1 q2 E4 j9 F3 V* _# L4 J
{
- H" p4 w, t6 a5 [1 \' s0 D std::generate(vec1.begin(), vec1.end(), []() {
7 r9 K; f7 H. X. |& M return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
9 U1 N6 p1 [* u' Q });5 B( {0 f ~/ S/ J8 L
8 }" Q, Z6 U5 f& S9 T+ y( q
std::generate(vec2.begin(), vec2.end(), []() {
* f4 w6 h$ A1 J& P return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
& p2 A& X+ t' q5 ] });, h5 O- |4 r& m d, h
4 p: \# B3 \$ H9 J4 S for (size_t jj = 0; jj < vec1.size(); jj++)
7 L- j9 l6 [2 q4 V" ]5 K0 f9 o {
: n9 A8 e+ p* i8 n b1[jj] = vec1[jj];
) D1 B& ^, O, |1 {& G7 i }! H4 V+ v. w( S9 ?+ n. q: P+ T% d
( v" z* y$ Z4 z( X3 R6 v
for (size_t jj = 0; jj < vec2.size(); jj++)
4 _( {, y2 {3 E' O9 o {
1 J: e7 `8 Y m. b5 @0 F b2[jj] = vec2[jj];
( J+ Z% M7 b$ Q- i- a6 t9 n- g }
+ e- _! O; w1 S" J* @) [8 y% ?
" u1 n' H/ Y( G/ A3 u, o0 R, ` //Method - 1 N=100000 247s
" N3 m$ K: O- v4 {& p% h* k //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
9 H& N0 k& ^$ l" q# G
% i, U: E8 w- \& l7 Q7 t$ p5 u2 V; n //Method - 2 N=100000 237s* |, E4 `1 I' K- p5 O
/*1 c+ i5 u2 y/ }( s% y+ q
for (int jj = 0; jj < N ; jj++)* `5 p- n2 ^( b9 i0 {" @5 z
{ C' P& x+ N6 Y d$ U6 }6 i) f! S
fresult += vec1[jj] * vec2[jj];; f9 r7 e7 e# f$ L5 c: m/ H3 ?2 o
}
7 T8 y9 X: [' P6 q+ a1 V */6 D. W) _4 @6 T6 c& E2 E
, J( d% Z8 m0 C7 A( N+ a& w //Method - 3 N=100000 204s7 ?7 k7 m- f8 }8 a
/*. |: v5 P z3 _% _3 t
for (int jj = 0; jj < N; jj++)6 o1 L, g& i) I" w1 E2 R
{
; h: I0 O! v' }6 n7 R/ y$ g' k fresult += b1[jj] * b2[jj];7 C( b( {+ P3 l' {* O O" I
}
# `; b3 F3 j' ^5 c */
: G' r. Y9 e9 p
4 e* D8 {, E0 O! P) ]0 Y1 K+ P //Method - 4 202s9 n, {( R3 x& j( Y. j; J' [
/*$ v3 M) M! s9 O8 s( s
for (int jj = 0; jj < N; jj++)
. R; m4 U i( N3 J {; ?' f$ G) J5 Y; t
4 }+ f) S" B) g" f+ } }
) S# x6 y2 U0 Y5 Z/ I */! P, ]3 A' s3 S* ]8 q3 ]: L5 [- d6 U
//comment out all methods, N=100000 202s 7 E) ?$ y5 L& M9 ]3 z6 i% `6 x5 W6 M
}
! o/ a7 q; }( {& ?0 F, p. E/ c1 t& U) W
delete []b1;
% f8 d; N' [2 ?& V! b* s) Q delete []b2;
+ }' J4 {* i/ o' T3 z+ Z1 s3 _) @ |
|