TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 1 l, W/ |0 k: X2 S& E0 l: ]+ y. I: o
) J& x; Y6 r$ I8 O4 P/ _& v0 Y5 J
理了理思路,重新做了一个测试。
! H( q \. Y2 O. W' Y做了两个 vector 和 两个 float *, 都长 100000
! C! w/ ]( r# e2 X外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.. F3 a4 h/ c- p3 t( n, o0 M8 Z3 [
3 V$ J! W. X, K! s内循环试了4种方法,- \) c7 ]! v0 Y" ?! Q/ i% l+ {
1. 直接调用 vector inner_product 247s . U0 m$ w8 I; d; E
2. vector 循环点乘累加 237s, n1 e( |: e- U; o: O/ U0 y8 T' I
3. float * 循环点乘累加 204s& `% k& @9 g; l7 M+ Y0 C$ O% D
4. 空循环 100000 次 202s
6 P: @7 [7 l# m2 d: o% X( f# v$ J$ V% V1 R' a
不做内循环 200s5 ^ {: }5 R* P
. M! D2 w2 G% R1 d
你昨天说的对,内循环本身占比是很小的,大头在其他处理。2 z z/ C" S! \' ~
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。3 B+ {) C, f* p( q4 a2 z) t- p
) i; _8 n/ Z6 t. K. L1 i( Z
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
$ H9 ]2 A1 \( c3 c& j) O( W
& G. M9 V* H- D! r(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL), V0 _% ^8 a+ s( W) V
( G, B. D" l1 Z( }2 h) N
std::vector < float > vec1(N); ^: ?. X6 {( U1 P: [' I( }
std::vector < float > vec2(N);
2 d! ?* E9 F5 Q' E float* b1 = new float[N];& H9 V$ f# p' }9 z/ \
float* b2 = new float[N];! Q- r. o9 j; b3 J4 U7 @
, G" P) P/ Y: p6 |+ A& x$ r* M for (int j = 0; j < 6000; j++)
: |, I# j& N$ |; \0 O% l# M {
) F: Z: n$ D1 Z5 R. H3 C H std::generate(vec1.begin(), vec1.end(), []() {
2 n( R1 h( _/ W/ M return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
% r5 t2 D' ^+ k" O9 ? });
3 Y) H' u9 L4 p% v5 M; O- X
o; O* m5 M% i2 {4 u std::generate(vec2.begin(), vec2.end(), []() {
9 P# k% v; E$ L return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;; l( T# P) e$ J* T; ]
});* |9 |8 i" V( e
& I# i g1 Z* f6 m
for (size_t jj = 0; jj < vec1.size(); jj++)
6 K+ r( O. f; M2 W ^4 S {
2 ~6 O* D; _6 G1 G1 d b1[jj] = vec1[jj];
+ M# \* V" G& j# V) t. ^ }# M0 \3 L4 |$ F( h
9 `- n* ?+ x7 e' U5 u o q for (size_t jj = 0; jj < vec2.size(); jj++)
. t/ r- w7 X" [ {
3 m R! o0 G4 x0 A" L1 { b2[jj] = vec2[jj];
. O5 v7 i, c( B) S8 e: k" e; {) F }8 M. |6 |9 y+ \
' f/ y3 ]1 ^0 F/ ~) u. g //Method - 1 N=100000 247s
* E5 X' ]) N+ q' G/ P9 l0 P //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
( M9 h \' S' z g* m! U. M & D& n# l( s; l
//Method - 2 N=100000 237s) W3 M7 C: N( o2 v) S! l
/*
& _" n( D* C" O& L; P, X for (int jj = 0; jj < N ; jj++)
4 d. m* X+ G2 Y- b, R: f& H {
$ y) b& f! s: n" b9 P fresult += vec1[jj] * vec2[jj];8 n$ G' L5 u8 k, a* J9 P" L
}, b7 x x0 l$ h; A! X+ n
*/
: l' |% d: {6 D) q5 X* F
6 j+ m) s' j; p( ^( U //Method - 3 N=100000 204s, i! k0 }6 y" S0 A, ~7 g1 D" F
/*6 {6 w1 w3 D4 }# _/ E
for (int jj = 0; jj < N; jj++)+ V- r8 B5 x) l
{" q+ \* Q1 k( Y2 d6 X' y( k) [8 S3 a
fresult += b1[jj] * b2[jj];9 i$ ]. D- @: w* d) d1 r- f. L& ^
}
* {+ I( S+ v" ?+ ~+ L# O" v */) x- F; D, Z7 ^0 k( M9 V
. k7 ~9 G. D: _! y2 @1 E //Method - 4 202s! d% G2 Z* R" t( U$ Z9 I+ ^( s) \
/*/ n* n: j. H% x: m; Q! N: c# r
for (int jj = 0; jj < N; jj++)
* H6 v5 I( V y! _+ p# d- W {5 m9 D) _7 ~7 n+ n
7 z& ~1 W& n+ P; p* X }
% ~/ t+ D+ m/ U! D$ ^ */
$ v' h; W3 S% H- q //comment out all methods, N=100000 202s # e R! T$ _3 a/ o% G
}
! q% i, ^8 j# _# ^8 R1 m; H+ U8 Y6 a: f
delete []b1;( C, D1 j5 s' x0 i7 d3 V6 p8 B. z7 U
delete []b2;
5 p, g* Q" W* U5 ^- L4 v' h( E |
|