TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 - ~1 T, g2 K7 v+ b2 C
1 H/ T* ^; `3 i0 j" V& H. L理了理思路,重新做了一个测试。: n. ^4 p2 m; y0 e/ c
做了两个 vector 和 两个 float *, 都长 100000+ c& ?5 P4 t3 p2 {) |- o
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
, W4 H I' G3 l2 V/ ~: z3 }1 \# `& Q$ E/ p
内循环试了4种方法,
! g+ S! v7 w- A8 ^" G! e( t1. 直接调用 vector inner_product 247s
" n# \3 m5 Z) _2. vector 循环点乘累加 237s0 y" D0 r: O7 \! o8 ?4 w, \- |
3. float * 循环点乘累加 204s
% K) n/ i( |. f0 I3 x& Y. i5 h3 F) V4. 空循环 100000 次 202s0 S% `: w' Y; H5 M1 {9 W$ ~
. i1 Q [# c, v; o' B不做内循环 200s7 e4 h2 ?5 J, i1 X% g0 E$ p* W
: y% W& i. W7 p! @& B' s1 W
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
3 D" i* I! k+ A' {: l7 E另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。6 m9 M! A5 B5 [" j( e* j3 l
$ J- V8 O4 g+ W9 @# \
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)% [+ K7 A# b1 l- {& J$ u
* l( n" `$ t3 a; I(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
! M n& K; g7 b% t
+ u- f9 q. V# ^% c: o std::vector < float > vec1(N);3 |1 T. z0 m' S& n0 B" L: S0 w
std::vector < float > vec2(N);
# H$ d2 @+ B( A% V7 z8 L6 b5 ?: l float* b1 = new float[N];1 n" {: R' U2 F. l* C' j4 G
float* b2 = new float[N];
# i! y* A" }/ p4 i3 ]8 F& i' F- x
" W0 t4 e5 s) N# o, j for (int j = 0; j < 6000; j++)$ A/ L6 `9 a5 k& o- |# U
{' t, i/ Z* w7 y8 @8 V* ]2 K
std::generate(vec1.begin(), vec1.end(), []() {
0 E: R% h5 K3 X; D6 @8 u7 r" b return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
8 ]5 j% e9 G e: j });
8 K% S! e3 W' _# n- v5 C
1 G: I5 i4 ]+ w1 p4 X2 e' g9 q std::generate(vec2.begin(), vec2.end(), []() {
' x# E- v8 ]# N9 ] F return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;) q8 X% [1 [. a3 M7 U1 p: U
});
) R: l |$ c$ x/ u8 W2 y
+ [4 W1 D/ A$ n# y! l( o for (size_t jj = 0; jj < vec1.size(); jj++)
! P. o h3 f9 l4 ~ {" q* O: H* v7 C7 `: ^* a
b1[jj] = vec1[jj];1 L4 j0 \" |" Q1 n( P
}, T$ U Z3 H$ y
9 w8 p1 t/ y) p5 n3 n for (size_t jj = 0; jj < vec2.size(); jj++)# V ~6 e4 U9 o! A4 C6 A0 [
{+ b; A) A! }; X7 k
b2[jj] = vec2[jj];4 D1 r3 I$ Y" C
}( \* y* _7 C( ~2 ~, G P
! ^' M4 S( f' L4 I+ N2 ^* I1 T" ^
//Method - 1 N=100000 247s
6 z. i6 ~2 s' n7 o w) C //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);. e) m; @. ^- U2 s
7 N* W+ ^# o2 M0 x+ { //Method - 2 N=100000 237s
! K4 j+ O2 b, F2 |% a" [ /*
: H( I& Q0 @1 Z3 [3 g! o0 B for (int jj = 0; jj < N ; jj++)
6 n% M, ?0 \, r1 k' Q0 f) B {4 k5 A& y) K; x0 f5 Y/ | X
fresult += vec1[jj] * vec2[jj];; D, \" V2 Q3 H: g# \0 m
}
& y2 r. w8 E% { */$ C& W( Q& T3 N3 P5 `0 u2 \
4 W4 \: s/ q# g; d* c
//Method - 3 N=100000 204s7 ]( u0 x" a7 |4 f3 S
/*
' {" i: g. P' D3 b$ s' x for (int jj = 0; jj < N; jj++)( n1 t7 o0 F4 n9 b8 W' d" b8 j8 \' V( O
{
" [6 \% J" [1 T1 T fresult += b1[jj] * b2[jj];
2 D8 z6 |/ @& P; @; C" \ }$ b7 W0 A4 s5 W8 Z( T4 D }
*/
8 `! r+ t, t, p5 }* t% u9 z( c
$ G& I. `" s1 ^9 y //Method - 4 202s
6 E* {7 G/ k# Z+ J) }; T: N /*
* G# H9 X3 h( d5 g+ f2 _" k for (int jj = 0; jj < N; jj++)
! [, \1 Y$ u3 l+ L4 A% d; f {
4 U a/ A3 Q' [6 O9 T( d 1 x- o9 ^3 K2 ~) ]1 n4 d( B0 d3 Y
}# ^4 G- H. |6 K1 X
*/% Z4 ]0 Q+ Z4 Y. a/ \, p6 T
//comment out all methods, N=100000 202s
+ G8 L8 ?2 P. r }
% a7 n4 l+ D% ~/ J- ^! a' K* L5 F
7 t. v7 a- |# I7 v5 N2 p" \- W delete []b1;
! }1 ^' k. C( a3 ]) @! ? j3 y8 D4 k2 | delete []b2; ( z9 C t2 Z. i7 g3 c
|
|