TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
) H$ ?' I/ r7 o3 C4 e# ]4 v, A7 H# b+ d5 F7 ]2 D
理了理思路,重新做了一个测试。
+ z8 T0 V* f. P2 f7 J$ Y做了两个 vector 和 两个 float *, 都长 100000
5 n2 u& T! s- H# w' J" t/ f外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
4 r9 U) p) |% k; `* a0 ^+ j. E# W" H6 n4 C
内循环试了4种方法,* N+ I) J8 J/ R
1. 直接调用 vector inner_product 247s Y1 W$ ^) a9 j h7 S* p; M# q
2. vector 循环点乘累加 237s
8 r( o; M/ @ v1 L; g3. float * 循环点乘累加 204s, `6 _6 K6 z$ N- d1 T
4. 空循环 100000 次 202s1 _ I- k# O% P6 U; b8 R! v
7 `& N5 | _! g8 i, _! u
不做内循环 200s g4 \7 K8 W+ S# b) Y. i) k& A
! A2 o# k4 U3 \ k
你昨天说的对,内循环本身占比是很小的,大头在其他处理。: f+ [2 f, G* ?1 J8 d
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。% B, i5 z3 C5 n& n/ ^* R
- P" M4 g- J8 ^3 C+ \* z至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
0 D% J0 n! g8 K" I) k( d* p
! O& h* z# q' d' U3 [(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)+ q; n; q# y( J( ^+ p" [; O: c I
a, G. R/ E) }9 H# W std::vector < float > vec1(N);
; F* }2 }- g5 F" `, R std::vector < float > vec2(N);
: y2 y) ]- Q5 f float* b1 = new float[N];& E0 B5 P% }4 W4 u$ Q. c7 N5 H; v
float* b2 = new float[N];
d2 l5 _% h6 G$ l a
" u9 E4 Y# Q) K* q for (int j = 0; j < 6000; j++)- H( \0 z h% f* {+ c2 ]; f
{- G9 a( A. e( m' {+ a( h+ J
std::generate(vec1.begin(), vec1.end(), []() {7 r- E) |4 ~: Y' `. Q8 X5 ~" Q* C
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
1 P* y6 |; Y p( i- }5 J& j });
J& u' n9 q& M v; H0 M! r+ M: k! e5 @% k# N( c
std::generate(vec2.begin(), vec2.end(), []() {: {; F' y) }+ A% y
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;2 i P3 g3 X; v' _/ @
});
6 S& M0 d2 a! } c, m& l
) q& _( c$ w- [; I, \. O for (size_t jj = 0; jj < vec1.size(); jj++)
$ g0 x i% F" ?4 i {; B- {- t5 e* a0 |$ _7 z2 `- x
b1[jj] = vec1[jj];
9 E) n. O3 L+ n3 m% g9 f0 v9 v }! a9 M4 p. g' a! ~
5 W$ ] N& x9 | for (size_t jj = 0; jj < vec2.size(); jj++)- a& t7 F2 K/ u2 W8 u) A
{
; A7 C- y* R) k b2[jj] = vec2[jj];
0 ]: Y8 a7 d i }
! o) ? z: o6 B/ O7 \# O+ l" C. D% c! V" Q3 v/ P4 B4 E- f1 m
//Method - 1 N=100000 247s 9 j. M. X* x) R
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);2 ~1 H9 Q; r3 z3 y/ F5 a' {
) q4 [! b) N+ i2 j; S* j
//Method - 2 N=100000 237s0 F- c, u( @1 d4 K3 N
/*+ W+ t2 ]9 b% I, }3 f- Q5 Q
for (int jj = 0; jj < N ; jj++)
- @' C V' v2 l3 p* m9 ^4 E {( e# |' i/ W' ^ [4 @ |7 O; r
fresult += vec1[jj] * vec2[jj];
8 G' I, L! s8 L1 j; ~ }# h3 u2 `8 H( V1 \8 P
*/
, Y1 z) B/ V9 x; J' p! Y
- F3 l- S9 v- w, i; U //Method - 3 N=100000 204s
+ y ]) Z: i: H# K h /*
: L4 }; x- K/ u! y1 | for (int jj = 0; jj < N; jj++)
% f! h# [. p v% \$ ~ {% q6 s) K% y$ u5 W9 K
fresult += b1[jj] * b2[jj];
& D6 {/ r2 l" ]1 @ }9 D3 |4 p4 ^9 [/ I$ L* @' @
*// @" G3 @" ~) A L
4 {# b q2 M- h {( a
//Method - 4 202s, t- D. e& ?' u
/*9 X3 x! _5 U3 O( A/ G4 E# i% m
for (int jj = 0; jj < N; jj++)
& O% j4 G4 H& Q+ }7 i {
) V; h) ]( h" L+ i0 X# I! j
0 R1 M& z, H7 f, ?8 d B% D$ j. h2 V }
' ~( y0 R) ?6 z# B& z3 g */7 t6 K% ~% v/ G8 T
//comment out all methods, N=100000 202s
: d4 Q% i9 P! w" D8 U! Q }
$ N1 \: G- u/ M3 d z$ H" k2 U! ~3 ?0 T) c3 m8 i- L
delete []b1;6 e4 I6 ?/ Q, C T( z5 S
delete []b2;
/ k1 o3 f8 q7 i6 J |
|