TA的每日心情 | 怒 2025-9-22 22:19 |
---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 ) J+ Z: Q' {7 Y
+ ^& o3 k4 r9 P- H; v& v
理了理思路,重新做了一个测试。
9 I& L3 \% z7 y# e, X9 ?% R( j& g A9 I做了两个 vector 和 两个 float *, 都长 100000
7 s( C6 i; `$ @& s/ t Z外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.9 ]5 z2 b5 z3 `
# H1 q9 o% O' u) J, b4 Y, n
内循环试了4种方法,
8 l& ]- r1 j* t* P. V' o1. 直接调用 vector inner_product 247s
8 ]6 _, K( |8 r# W9 V6 U2. vector 循环点乘累加 237s' Y2 M4 M/ m$ i' U
3. float * 循环点乘累加 204s# r5 \+ [, [( g9 b" Z
4. 空循环 100000 次 202s
# \5 B# ^4 n1 A- |6 b" M+ e8 `
# p) f2 f# u. d/ n7 U% |" f H9 `不做内循环 200s
4 ]5 s j1 H; V& X7 M8 C7 @3 X. v/ h. L4 m& u
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
$ H4 T" x* g( }另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
& _. m1 t$ f; M( L, }6 ?2 m: p9 ]
( S; }* F7 C s" D, {- L2 C* X至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
8 r+ O$ a. u/ H3 P+ r9 b9 t( y* ~1 C7 u5 [- m2 ]( z! ?
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)& p' q1 ]- g7 g
, @3 n8 v! ^ l- ^% J: L
std::vector < float > vec1(N);8 h0 @! Q( H$ \8 Q5 F" G" I
std::vector < float > vec2(N);/ P: D7 k: N3 L4 Z9 a' K
float* b1 = new float[N];
0 C0 _' r* \+ \: X/ O- K float* b2 = new float[N];2 Q/ s- M3 H ` v6 u( i
6 p9 Z8 q6 |$ i# q/ O! j
for (int j = 0; j < 6000; j++)
7 x! p$ D) q+ A8 l9 r& }2 l {7 {% m7 g& C" H
std::generate(vec1.begin(), vec1.end(), []() {
& z( A: Z6 i/ D! q return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;7 v: p3 S4 y9 M
});
) d$ x! d* ^7 X. C( ]3 @+ s; P6 A) {1 v9 t, X+ w3 f1 u0 y: A
std::generate(vec2.begin(), vec2.end(), []() {, T2 q8 A% e$ F! [
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;! R4 i- |$ D2 l: o; e. v7 E" D% R3 e
});
; C* k$ D7 Y0 D2 c* M) L/ _8 H- m7 u) ?
for (size_t jj = 0; jj < vec1.size(); jj++); j4 ^# i; S! N
{
7 P6 `$ z7 ]" y b1[jj] = vec1[jj];
' j) [! O) d' c( _7 {- ^ } P2 S. N+ e. G
4 Q% f! j+ O5 T8 y
for (size_t jj = 0; jj < vec2.size(); jj++)
* c8 h% p+ v1 c& ` {
2 ?. N; B7 C" P b2[jj] = vec2[jj];( L/ ?# } m" }. t. v+ X, A
}$ V1 I M3 X: P6 K2 V2 S0 Z
: U: H$ a8 [2 {9 s5 ]" F
//Method - 1 N=100000 247s
7 [' [. S; @1 O1 |( E1 Z) D6 M //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);4 k2 Y7 y7 b6 M' e" A! _: D
" z# V& {" s. e) r" N: v+ [* R( q //Method - 2 N=100000 237s
5 s! n% G7 V2 G. R /*
2 ^+ f. t$ Y3 z: J' s6 |7 j; j for (int jj = 0; jj < N ; jj++)+ f6 ^* g+ o8 n' u, a
{
, P, Y" v/ |4 S* m- S* q' |3 ] fresult += vec1[jj] * vec2[jj];
& Z& W2 ]# S5 d' q7 y }
. G2 | z! C0 S: f" `# T5 s */
2 b$ f) S3 _) G/ D7 X 0 `7 x$ @( D: Z5 R/ e
//Method - 3 N=100000 204s: U( B- C- \6 [* {' N3 v I" m
/*6 l* V& V' ~: }
for (int jj = 0; jj < N; jj++)
$ H( P: e+ s2 I( s9 Q5 f { k+ Z- z8 b% I! p" I, @
fresult += b1[jj] * b2[jj];# }2 q' u2 ]' V5 c" v9 D! `9 L
}# P+ E" V" B( i0 K% ?
*/8 j: A5 @0 {/ T F4 {6 F( w
0 k) j6 q2 R v) n //Method - 4 202s/ J$ A. [% [# K
/*: w" f. e& i" C! r2 P2 T
for (int jj = 0; jj < N; jj++)+ s; \: @- \: }# E2 M( j- H. D
{
G l J( L S# ^9 V' a
) c6 n) T8 q( \( q }: q& l6 A2 i' X! k b
*/- x) w3 m$ A. x4 ]* T
//comment out all methods, N=100000 202s
9 g; [- Z( P# {* y }! I8 j& C. U; j) E- v& y
+ {" Q1 b3 R" J/ t$ N* d$ S delete []b1;
8 ^: m& i" z. } delete []b2; 1 u+ q# h% e k0 {- k" O
|
|