TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 . f4 W' i3 I9 u
8 H. K$ |( H; Q% k) O理了理思路,重新做了一个测试。
/ g, I: n/ X) d3 A+ J4 A7 L% ^6 N做了两个 vector 和 两个 float *, 都长 100000 U; }* Q2 y( [& D9 R# _
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.( e6 A9 h; ?. A4 H, Y: S: N
$ F/ |3 x8 e" ^0 O& ]. z! W4 p
内循环试了4种方法,* j! Y& \' n$ |5 p' l1 W( p
1. 直接调用 vector inner_product 247s
# }4 p0 R# }1 K, h2. vector 循环点乘累加 237s3 P3 z2 E9 g- N* w/ Q( Q% _0 ^" E3 ?
3. float * 循环点乘累加 204s' H9 v- G% v0 P; R
4. 空循环 100000 次 202s! w5 t9 y7 y- W0 ?5 n( M
7 }" X; m9 [; S+ i
不做内循环 200s. f/ `9 N6 h: m& F. N
1 |+ G8 e7 C* V! ^2 v
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
$ X5 x. I+ D% O; N/ F另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
& f$ Q1 h3 ~& w1 B
& _5 H6 I" `5 n) f) k至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)3 t( v; w& ^0 U8 D( _( T
4 I G! K7 X( G1 b- E% c$ c2 I% [2 J(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)3 n( ?% M9 C* i7 X& Q8 v
. u9 ]+ a2 w1 L std::vector < float > vec1(N);" X6 }8 Z! A( G8 E& @- Z; n
std::vector < float > vec2(N);
! e' i4 u( ~/ z7 h4 j0 d. G1 j float* b1 = new float[N];7 H9 O" V k. s8 c
float* b2 = new float[N];) \4 }, e, v! ]4 L/ ?
. _+ |: T( C7 b) l' S
for (int j = 0; j < 6000; j++), ~6 c" K& e: ~1 Q' ^
{- v% J3 v$ \, Z8 J8 [0 S
std::generate(vec1.begin(), vec1.end(), []() {
3 x1 ?8 v! n3 x5 n& D return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
$ H% \3 P! `. f0 y* l" _ });! t7 ]% H3 n4 q. m) C, ?
" I2 [, H( s! X; @0 ] std::generate(vec2.begin(), vec2.end(), []() {
- w* ]% K$ Y: B* G* q5 b7 V8 r return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
; ]+ \2 t8 f* S7 e4 Q7 P });% x% I! e* B" g$ _- J1 D
+ |: j5 F j: G) H* A for (size_t jj = 0; jj < vec1.size(); jj++); e0 J" `! C H* V
{( j. n9 I2 \" ?- E$ A# T4 v
b1[jj] = vec1[jj];
3 ~3 F# Q- r0 H& {$ x' j }
, P, V. @: f) H9 _3 G+ l4 U% X3 @! [8 \/ O! ~2 G
for (size_t jj = 0; jj < vec2.size(); jj++)
. m1 V. t3 g6 ?% i0 I {* u1 V' N j0 x8 F5 y8 d
b2[jj] = vec2[jj];# w$ ]" p1 V+ z% w
}* u! x/ r3 ?0 T
% X( ]% ~. D: D8 o
//Method - 1 N=100000 247s 3 ~; e! [4 W, p- }
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
6 K1 X" T. S$ @6 a / J! Y& l1 j; R K5 C: Y% T: K
//Method - 2 N=100000 237s
* [( J' d& C) A /*
! X% f( j# i9 w$ ~5 o7 ] for (int jj = 0; jj < N ; jj++)5 _5 @% T' O; C' x U
{, J8 o5 A/ V6 ]& V
fresult += vec1[jj] * vec2[jj];
* J5 H5 |* M2 x' {3 g }' o: s, J1 y. @3 M% E
*/6 K+ U/ t. F, [9 x5 T
$ ^9 R9 T7 J8 d7 n8 X. {7 K //Method - 3 N=100000 204s
/ D2 W7 a) E3 w; X3 o /*1 [+ B w" Y- {0 Z( `6 H$ ?+ a$ W" X
for (int jj = 0; jj < N; jj++)$ K1 o! u5 C6 a: A# ^6 `; W4 I
{
2 @% D' P# G6 a* w0 A: ~ fresult += b1[jj] * b2[jj];
K$ q$ `/ W7 t( z( p% } }+ A0 m7 m# Q2 i+ u% i% U
*/1 r+ `9 s5 f1 S [- O0 W
; s& {/ b' N: } //Method - 4 202s- ^. z# p( F O
/*4 Q5 l2 i, g( I: c# J; z5 f
for (int jj = 0; jj < N; jj++)5 @; o3 ~( X" P8 b
{) i) C" w1 `: ~; o6 y& c$ q
2 ~5 n, \$ A- Q- c9 m# I }0 C0 A; C+ J1 [ p. G+ f( z
*/
3 b' b) C& U2 Q( S0 |8 S- a //comment out all methods, N=100000 202s 4 b/ D( \4 x2 a. i
}7 N# ]1 q* B2 e# Z2 M4 Y0 H
2 L( P }% F/ |/ t! X8 r5 K delete []b1;0 M# i, N3 U5 r0 W# ~
delete []b2; 7 o( J( X3 F) n0 i* F+ `
|
|