TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 9 M1 @. G8 d+ l8 v: _2 \# x
* N$ V; u) \+ e' v" s3 l理了理思路,重新做了一个测试。2 O0 B9 U4 H4 H7 z! P
做了两个 vector 和 两个 float *, 都长 100000, W0 Y0 ^# e/ E$ x
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
) z% s, w/ p/ a) H9 A9 | Z
) v' a# B) o) {+ K0 y, B- L内循环试了4种方法,* W0 m) O3 `5 T3 D4 g1 U1 ~
1. 直接调用 vector inner_product 247s
! L- C' R6 Y1 x; W2. vector 循环点乘累加 237s! h# k, R- f# Y, X9 W# D# N
3. float * 循环点乘累加 204s
! ^6 [ @) e& ?& i/ K" |/ {4. 空循环 100000 次 202s( ]1 A2 m! o0 g$ ^# D2 o9 a
9 O* M" H( x0 Q6 l
不做内循环 200s* a; P( q" D8 a4 X: Q+ D
M0 t6 ~( |# T; w你昨天说的对,内循环本身占比是很小的,大头在其他处理。& _5 q% o1 k& c$ A$ s
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。3 G( O. V/ `4 T/ x7 W0 b, T E# y
* U/ R/ m+ o- k/ m/ w5 r至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)) v1 B3 V9 Q5 i& e: c3 E
% X( M6 m6 g" C: P! Z4 V7 d2 q(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
6 Z' o# D" j: f
! R, y# g3 W$ F6 T std::vector < float > vec1(N);
r1 x0 g1 V( b1 r+ m std::vector < float > vec2(N);
$ h+ G0 n8 E( B float* b1 = new float[N];
: r9 ]" m5 o3 Y2 K: c( }( W, Z float* b2 = new float[N];9 Q0 Z. M# o Z2 x3 T" |
, D, G& |2 D: O: n$ L) B& k
for (int j = 0; j < 6000; j++)
8 o& |$ ]& w! _% y {# L' P) e. a( @& y
std::generate(vec1.begin(), vec1.end(), []() {
: u4 L, B+ Z1 M+ o* J. n return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
( S P; [# X/ C% U; j- ^8 I });
w5 l$ M- H/ j3 O3 a2 h6 f. `( k& O2 @: i0 A: v7 \% ~9 J
std::generate(vec2.begin(), vec2.end(), []() {, G- e2 l0 _- F+ P- A; v
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;5 r. O% ?3 K" |* Q f$ ?9 ~
});
2 T) U" K$ d" U$ |) O2 }& u6 ~
; K: o6 ^- T" ~- h for (size_t jj = 0; jj < vec1.size(); jj++)
3 ` p# D( S& U) z! h {
+ {+ c r0 M! X. S& o- v b1[jj] = vec1[jj];
% u! @. A: ~' W% p }9 L# N. [# |8 \9 _1 [
9 y6 X7 Z2 c8 ~- B3 u- O' B
for (size_t jj = 0; jj < vec2.size(); jj++). |' n' D: t* b- \3 Z4 M
{! B) u, L7 h3 t2 h# G* | S! J9 k! P
b2[jj] = vec2[jj];' I- ^4 M& n" p f+ l
}" u. n3 L8 B2 q
& c( J% G- B* [ //Method - 1 N=100000 247s * g5 m3 U" _4 V/ \
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);0 Z; N% R9 j7 X. L1 {
! y% Y# r6 A4 T+ L" C' l9 j5 M //Method - 2 N=100000 237s$ d- \6 U& ]& f7 z; L% r
/*$ E, a% S& v! W- S1 s! j* g
for (int jj = 0; jj < N ; jj++)
; d# z" Y+ L( V! `; G8 u {9 m! q! ^+ y0 |; Z: i
fresult += vec1[jj] * vec2[jj];2 s( p6 [' s% J8 N* G2 U# U( g
}9 R2 [' d( a4 B+ w1 _
*/
1 s# V& N+ y& N/ d: v- T+ g2 c ) `% Q" Y. v7 r0 \. {% L
//Method - 3 N=100000 204s
: r9 r9 C; ^$ |2 ? /*. A+ v6 u+ e" ` L! W; Q/ I; Q( E
for (int jj = 0; jj < N; jj++)
% d6 p$ [7 x0 w& N {
/ L: p) b6 V3 A1 W6 t: G4 C+ Z fresult += b1[jj] * b2[jj];3 [$ ^3 T+ m) U
}" o$ |, O' c w( b0 e
*/
" ]; H3 m% j5 H# d7 I( i/ m
4 Y/ C/ T4 N. s$ ~+ {, J U //Method - 4 202s
2 P2 R- U3 W( J4 } /*
$ M5 | P' K/ E/ i4 [ for (int jj = 0; jj < N; jj++)* n- J4 Y t6 ?
{: r7 _/ L. z, p7 W: l& |" w2 h
- l% w& w$ v3 D7 g) l2 I9 J9 O }$ \5 j. i5 @4 D( d! G F
*/
! L0 X7 w- `- }" W //comment out all methods, N=100000 202s 8 ~. _1 J4 V8 U, W7 l' s" Z
}) G8 ?" g0 \% A/ L6 d
! k; g" L/ h. i5 r8 d; w4 U1 F
delete []b1;
% g% i; M# ?. c* } delete []b2;
+ [5 } q* r0 ^% b" X. [% x! M |
|