TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 / d4 W( X( ~& @% P3 R! d
7 o* [' C" N* r3 N1 P理了理思路,重新做了一个测试。5 A$ o% ~, N9 \2 U6 h7 S: n5 ?8 c1 y
做了两个 vector 和 两个 float *, 都长 100000; g8 @6 {3 V% E9 a
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.) ?' r& J! X; |
) r* `0 v; F2 ~( i6 @内循环试了4种方法,
- Y# E, |- h- j7 N6 g1. 直接调用 vector inner_product 247s ) J' m- T ^1 n9 |" l6 A
2. vector 循环点乘累加 237s6 [2 ?6 q5 H5 l2 M7 c7 {
3. float * 循环点乘累加 204s& g: ]6 t8 U( n1 h' E' C
4. 空循环 100000 次 202s
- l* [& e& M2 U. `: S! C
% w+ k! a6 J, H0 o( R7 R! r不做内循环 200s
+ e1 o! q( [' J! q) s$ d% ~0 A0 e2 }; ]1 w
你昨天说的对,内循环本身占比是很小的,大头在其他处理。( _2 `4 o! [% z. v; a
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。! O) a( C9 T! c1 E) G9 R
# t" u- R! u/ N; D& A3 ]/ c; A
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)0 U* G w* [- e# I* ]7 ]/ C2 e
5 O( U0 e& a4 |; h
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
; X+ l- W8 b) s0 g: F: L! V
4 w4 d% e9 E2 @7 K std::vector < float > vec1(N);! v' T ?# ~5 G3 w, ?* r c& `
std::vector < float > vec2(N);) n4 N& L5 G4 } {3 h1 B/ L8 n
float* b1 = new float[N];
$ L8 j& {. o" Y$ t9 O( \ float* b2 = new float[N];1 z- }# L# z. [9 {. N5 L
* x. z2 O2 f8 r1 n' y4 l
for (int j = 0; j < 6000; j++)2 i& o- A' }% n4 b8 p2 u
{
$ k' I6 p& c; v1 S8 i) ?7 X1 C+ h. n std::generate(vec1.begin(), vec1.end(), []() {
1 v8 y( u) O% H5 q return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
7 K, n/ a* V% L( c ]6 H+ m });/ _9 o- b. v3 L3 P8 M
! u2 [: l2 H$ n- P std::generate(vec2.begin(), vec2.end(), []() {' Q2 _0 O9 u8 [
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
/ g8 B5 k* [0 [7 m! m! o! a: j/ Z });
& L* g4 ?" |3 x, C2 G. X: ?/ X0 E
6 T, t: F# C0 L+ y, z4 D6 W$ s for (size_t jj = 0; jj < vec1.size(); jj++)# @; {7 q+ s: S( T: @9 y8 ?" l/ n
{: I' B: |7 ]* s8 X. }1 A, ?6 O g
b1[jj] = vec1[jj];7 m, c- q, E3 ^0 o& F( B9 L5 M3 g
}
$ ^1 B6 @4 v. p0 S2 r% L5 S6 i$ B9 g& @5 O' q$ P, A& ~
for (size_t jj = 0; jj < vec2.size(); jj++)
) H8 a% B8 t l! p$ l; A/ ]; d {
l7 R1 {8 o1 Q/ t, F' ` b2[jj] = vec2[jj];
' r4 ~: j4 C6 T! m! n- H }$ [* H0 Z# ]0 B' c+ H1 Q* q
: N0 F* {. u5 m! W //Method - 1 N=100000 247s . k, Y3 A" c# }) \* n
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
3 T$ a3 I# A' Y$ ~) a- X / n' `, k$ E& E( {
//Method - 2 N=100000 237s% n6 \ y% C0 B! _& Q* {- w5 Q
/*& V% |1 x" C% g5 i1 r; h
for (int jj = 0; jj < N ; jj++)4 @5 A1 a- k* o/ V
{
8 _, Y# o, m; H% K fresult += vec1[jj] * vec2[jj];
: _& q! s# e/ y" c$ X: b* q }
7 X/ M* U2 w2 t5 \- u% G */
N/ S- M1 N1 z+ m/ R # v, ]4 Q+ l1 w) A2 E2 s
//Method - 3 N=100000 204s4 X, M7 W6 a/ D A
/*! L; D0 D; g4 b' }( \+ w
for (int jj = 0; jj < N; jj++); A% k9 H$ ~+ W- `; S, g- ?5 @$ C* ]
{4 e8 C2 I2 E; J: \
fresult += b1[jj] * b2[jj];$ I7 N9 E7 }# L) R
}9 l6 t/ u8 v' X0 T
*/
2 O1 o1 g: U+ c4 l
* {, t, C8 u5 i2 X6 }& w0 i //Method - 4 202s
9 w9 b0 n# y1 [! x# S /*
% F9 Z( q! A3 f v% }# X for (int jj = 0; jj < N; jj++)' T9 {. P3 |" M$ K8 }" R$ D$ T
{) V& R! ^% H- d6 F1 s. g
1 [- x& Q3 p a) E( }& ]9 J5 s" L }
3 M7 a6 B; n9 q6 }/ F */# ~0 G$ j7 d4 y0 l) G1 v
//comment out all methods, N=100000 202s 2 C# p' e7 r5 _+ Z5 j. Z
}4 x& D$ P# B9 w9 N
9 t* G9 f1 p1 U$ ^( I D4 T" @ delete []b1;3 J7 o. u0 F3 S5 s1 B: j
delete []b2; & X; _1 B& |7 \* M
|
|