TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 9 u% O; f, [1 E1 J9 Y0 z3 A
5 R' V; x5 [) Z. F) D2 K5 e理了理思路,重新做了一个测试。0 \4 x! F: K+ n
做了两个 vector 和 两个 float *, 都长 100000
4 _$ W5 E, y: q$ X; I外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.! Z! h/ F" X; _( L2 w2 s
4 V" }) T# g/ E d
内循环试了4种方法,
6 ~- K0 ~2 b! j/ H' I; t" y6 s, T1. 直接调用 vector inner_product 247s & Q* j1 p" S$ i/ N8 o% y" @( B
2. vector 循环点乘累加 237s) k; r" \3 U: W- k: o
3. float * 循环点乘累加 204s
% x. v2 R) ~9 @9 \1 r- W3 u% m" G4. 空循环 100000 次 202s7 m7 ~( s( ]+ u6 Z2 |
3 M5 M, P E$ x不做内循环 200s
; s8 f/ p5 H9 p- O; Z* A0 t* ]3 q5 m# u1 a7 p1 _" B7 u
你昨天说的对,内循环本身占比是很小的,大头在其他处理。4 n3 L9 l; Z* C) D- d9 [( l% q
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
6 m3 C& u$ a' _% l
$ I& f& K4 X. ?/ I0 ^4 l5 _至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
2 U/ M4 I+ T( y% {4 Z1 p% N ]4 h4 _$ ]; E
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
: S" ]5 r$ D. ]1 B; I8 R) ] A0 H: n e* V
std::vector < float > vec1(N);
* Y" t& W* u1 s std::vector < float > vec2(N);4 p8 d2 f# e0 p* D3 p3 W
float* b1 = new float[N];
# Z) n5 q5 o" {0 m+ W6 z3 ] float* b2 = new float[N];
' U7 ]0 V- h! y2 K3 T$ D" S, j: V7 {5 `0 b
for (int j = 0; j < 6000; j++)
; a( @4 B' N7 F+ i" Z9 e, |6 l; w {
- M8 `9 Z: e3 q- F std::generate(vec1.begin(), vec1.end(), []() {; S8 M& w$ }! H; _6 h" w+ c$ M
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;; q9 E( Z+ Z5 M) x: B% j
});
; \6 \2 W" X+ X2 E; d9 s8 p! R
& u$ J5 Y* ^% T9 l2 e std::generate(vec2.begin(), vec2.end(), []() { e+ A+ ?8 ~1 \( a/ Q8 K: @. j0 l
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;, `1 J* z3 {! J9 Q* @, |1 H1 n
});
8 m+ U; E: L7 d4 \1 I( h! T8 t: w$ L! p* {
for (size_t jj = 0; jj < vec1.size(); jj++)8 u# \; z; ^! Z8 P# Y3 J
{
9 p4 A3 `+ p& K b1[jj] = vec1[jj];
; w* E( o! I" Q1 N- m; O }
) }0 j9 m+ g6 O1 O& U
' }2 i1 {# X- y4 T9 a7 b for (size_t jj = 0; jj < vec2.size(); jj++)
) ?( a% N/ e g, { {
5 U7 n9 B8 z: z( a b2[jj] = vec2[jj];+ J! d7 {# z- C' u3 d
}, D6 U. A3 y; ~. I9 |
, E7 i' R& O- [5 Z
//Method - 1 N=100000 247s
\2 _6 [4 C. K //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
1 q, J7 }, @! E0 Q, s % J) T% ~- A/ _! F- @+ l+ `6 V
//Method - 2 N=100000 237s: W9 ]( ~+ ~$ i% \' C3 F6 L4 `, N
/*+ Z' J$ q- w w& }
for (int jj = 0; jj < N ; jj++)
$ w, J: v$ x4 ~) Q5 t {+ R$ n# ~: r4 w/ y/ }& Y3 D
fresult += vec1[jj] * vec2[jj];8 U4 z% z% a' m: N$ s# q8 m" w$ P
}
1 z7 Y8 W9 X* _' H5 u" p, R, P* x */
, [, g, o5 U' W7 i- v1 p 2 v5 s/ @# y5 @! \7 [: ]4 W
//Method - 3 N=100000 204s
0 J, K+ ]# z) @- D' B% @* y /*
9 W5 q! u- B! c& l6 a for (int jj = 0; jj < N; jj++)
) x: S0 p) L3 x2 ^* e3 T2 { { [0 F/ t3 C3 d
fresult += b1[jj] * b2[jj];8 E: m$ l& T) E; Q$ {* K
}
% D' Z+ v5 J2 n( K2 @% v */$ h6 z: M, G4 z$ A+ f
. q" R6 }' u2 K1 ]! c9 h
//Method - 4 202s
; p& G' h/ F% \; j$ L; X /*8 l5 F; t1 Y1 |, _
for (int jj = 0; jj < N; jj++)( ?& b) m( n" q# ?
{$ O# S, W, t* N! [- l, z" |/ o
5 t; w& i( R* F V! p9 V" ` }
3 I; q( }& s9 _! P. D4 A */
, `! w2 M5 c# w7 K( b6 C //comment out all methods, N=100000 202s % ?: B0 _ x1 G
}" o4 _2 ]; ` e# F: w, |8 z9 O
1 i2 c+ Q7 E9 V/ r/ p' O+ j
delete []b1;. I" ~4 F6 i" h( z- F8 w
delete []b2; 2 G' Q( L: D3 a8 T4 @
|
|