TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 3 g& j5 C+ [% X7 q1 E$ Q! k" w
4 Y; I# s) C; f2 v! R' s& m
理了理思路,重新做了一个测试。4 d! I$ L) b% v3 N
做了两个 vector 和 两个 float *, 都长 100000
' x. E( F- ?" P' |( @, H外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.0 }4 ^* ~% w2 F+ w7 b. S0 z, D
W0 e7 X% C( z( p内循环试了4种方法,! X- i3 Q- z: f5 }& }7 A. R2 C
1. 直接调用 vector inner_product 247s 0 h( k( a2 C# y% B: h8 L/ `! T
2. vector 循环点乘累加 237s. P, T# t6 y2 `+ Y' u
3. float * 循环点乘累加 204s
$ b% ?; e, s! V: v2 e# g' J4. 空循环 100000 次 202s* o' g( p( G% @ U u; h2 ^* t% S
" S w! H6 C: ?* k不做内循环 200s
5 S+ R! w/ q$ P- u& a. F: k# h/ m& }0 {% }
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
L9 n/ {) O* f2 u5 p" g8 v另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。# w0 D! s a: z! V/ M$ ^1 W
+ j. ^ ?/ F \% i$ ^
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
9 `( Z1 x6 F; T
# o4 ]2 b0 B0 b, `2 X/ T* Y3 O(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)2 v6 {0 E5 g& L d% N8 k: ^& O0 E
; B$ p- m" W7 e- ]
std::vector < float > vec1(N);! o, f: L1 L& u7 I3 `4 `4 z7 c* T
std::vector < float > vec2(N);
x$ D- Y( L/ q float* b1 = new float[N];; ]# B" F+ F+ Q! J. L! C
float* b2 = new float[N];
" H3 n! G3 s3 U9 |, D9 z" b" Q; i9 G7 a' u* I
for (int j = 0; j < 6000; j++)! n- z+ D/ l; E2 S7 n( s( J; y
{2 D' W5 f$ l; u+ E5 {& u: g
std::generate(vec1.begin(), vec1.end(), []() {
1 o" ~# @& T% I return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
7 q/ n# v; l( u( Z6 T% b! { });
& t% D' h; k0 {" b( U' P# q
$ X1 R( c7 U5 A8 t6 _ std::generate(vec2.begin(), vec2.end(), []() {0 m6 }$ m' t! @1 ^# j
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;+ I2 [. w( l/ p. _
});
2 B1 a2 j8 K4 g [$ `: f
; T/ n) p i9 P2 \ for (size_t jj = 0; jj < vec1.size(); jj++)
- H' x, m; _: [ I+ \ {
# W, E% e1 @7 C* r, _ b1[jj] = vec1[jj];# y9 u9 T* d6 v7 Z& a% I) J
}
$ f- F' ]% R4 m- i& u
3 w c4 c5 ]2 B* ]! i& @ for (size_t jj = 0; jj < vec2.size(); jj++); a4 k: R* j: v% ~; d/ x5 i
{
H8 R; j2 p( o b2[jj] = vec2[jj];
( d% A @' O; d* h5 C G1 ? }# E9 K3 L% \" k: K( u. o; U
$ x7 ~' ~, S* T7 y //Method - 1 N=100000 247s 3 w) T" }# |& p9 b% n2 S3 D
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);9 S* D3 _; R* A; Q/ k. S) T7 X
1 H) ~& N( Q7 S4 e6 [% M //Method - 2 N=100000 237s
5 W4 s; w- R& ^" {( l5 } /*
7 t8 n8 Z F, H for (int jj = 0; jj < N ; jj++)
: ~. U2 i1 V* @; d! X* G {5 u% P" j3 l0 r$ ^
fresult += vec1[jj] * vec2[jj];' [* u; N, T1 t" q. {
}+ S; s1 S7 j3 t4 }' x
*/- v9 T1 |/ q, j# |4 ~
+ G( T, c5 ^% @7 i& N
//Method - 3 N=100000 204s
9 V- l+ U) A# Y) n2 w) h0 G- t /*
# [+ L1 v+ @9 O/ \3 ] for (int jj = 0; jj < N; jj++)
7 n1 [' x2 C" n {3 g2 k4 @8 T- f+ ?6 d" J
fresult += b1[jj] * b2[jj];; |7 e; @; X0 d/ D4 _- [8 U& k
}4 D) M8 h- ~8 W- ~( ~
*/
! X2 T7 j- s& t& B4 @" \7 x
- ~$ g$ P! K" G: Y4 Y; N //Method - 4 202s5 O" s& }& y1 a& j
/*
4 p7 k2 j1 F% F$ [8 V* ` for (int jj = 0; jj < N; jj++)9 s# E& d5 F$ p- Z( U
{1 |+ J W- ^8 i) N' m6 g6 |
& H9 H* `, U3 ?; W! `6 x }5 b0 m/ j4 w1 j: J* |9 h
*/
2 U: I/ h/ X* @+ e. t/ e% ~ //comment out all methods, N=100000 202s
/ ?4 r9 Z) f1 t! \! b% ? }9 R, D& t" |# G/ i4 w( p6 i
% W9 f( C9 F7 |- T delete []b1;
& Y$ F3 \# ~( k delete []b2; & |0 i/ a& n! ]
|
|