TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 + V; q( ~6 W# A8 z* f- I4 m
: k( T+ I3 k# q% q理了理思路,重新做了一个测试。 Z" J7 F# f5 V1 M7 A" s
做了两个 vector 和 两个 float *, 都长 100000; x: z( T7 i- e w$ N! P1 Y4 d6 A
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
# Q/ x) X$ k w& p
/ ~5 H/ X/ W# b1 |6 ], M内循环试了4种方法,: X: z, y, T0 w" o
1. 直接调用 vector inner_product 247s ) B( O, B$ J% P
2. vector 循环点乘累加 237s
$ E6 a" r' [& U! P K3 C/ K: u3. float * 循环点乘累加 204s
' ~/ t6 R7 \- U/ n5 W4. 空循环 100000 次 202s! W# C' r6 ~& S
5 S% N7 s' b% k3 h, n不做内循环 200s
; y# l/ d) f. O( m1 s
0 j; d n% ]' ?: _- ]* O: \你昨天说的对,内循环本身占比是很小的,大头在其他处理。
' s4 B6 D$ M1 ?2 J. ]( f" b& l另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
) y* h. J/ ?) t6 Q- g+ `
5 N+ f. u0 n' r# h: a至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)( Y$ V9 X0 i: A: O9 w
9 ] V' y8 Q9 s2 \
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
. v" c) S2 ^# E0 o! ?
/ J! u4 n# t3 a; F std::vector < float > vec1(N);
k& M) l& ?/ \% i) T5 M u std::vector < float > vec2(N);/ p5 t0 [+ C( |8 j
float* b1 = new float[N];
" A: G: _2 u+ D3 ^9 k float* b2 = new float[N];
d" X, C3 y" L) T0 v7 n% j& w& l; i' b1 ^) h
for (int j = 0; j < 6000; j++)
: j+ x3 V+ h0 n9 p' n2 ^2 O4 j {; t. z9 P; c5 n
std::generate(vec1.begin(), vec1.end(), []() {1 |3 |4 _$ u# Q7 i z) M. I
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
' d; F+ @8 z- K! M( \# ?4 c) } });
* P6 W* W4 }" n
4 B; R0 E# H# [ std::generate(vec2.begin(), vec2.end(), []() {
( I3 P- j `( @3 L# y9 \' R return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
! \- S1 _( i+ F0 T7 t });$ U; A; s. `- ?* k% r2 A3 T2 E" b
1 Q: I6 [9 i( _6 q: a/ n
for (size_t jj = 0; jj < vec1.size(); jj++)
. R! o3 \5 _3 s0 _- h$ C {3 ^, Y5 a8 @' Z2 q
b1[jj] = vec1[jj];( S4 P1 J* F$ L3 s6 R, X; _$ H, T
}
! ?/ r+ C. F R( k; U4 E8 o2 z
& |* V" t' ]) u0 @5 T Y- b for (size_t jj = 0; jj < vec2.size(); jj++)
) F7 Y) z, h* d' K1 g( r0 e {
" j x! v% C- h- x' T b2[jj] = vec2[jj];
# K8 I* J% [+ @4 J- F/ J% T }
: m# i9 M1 Q4 ?. O$ ^6 N7 G7 C5 C5 s( N: t
//Method - 1 N=100000 247s @5 F, y- i8 F. v: m
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
' s1 }& `' t) ?9 Z' ?
/ l8 J9 A; V' k& S //Method - 2 N=100000 237s
0 G B5 d* q0 A0 `; N" V /*6 G' S/ d' g# z$ U
for (int jj = 0; jj < N ; jj++)
7 j- ]0 G8 V0 n7 Y0 P9 t {1 E' s- D9 v4 V
fresult += vec1[jj] * vec2[jj];& X% Z `2 p, K* G; H ]* ^) k; r2 @2 H
}
2 {4 D2 R1 Y0 E+ p* L */9 ?$ \! x. d) N( U) y
9 V% Q: P0 C# X. K; p //Method - 3 N=100000 204s
' Q' c/ E M, [+ j /*6 u6 }2 {! Y. D( S L7 E
for (int jj = 0; jj < N; jj++)
" d6 w& @ k {7 E1 T. S {
/ t0 \& n% i, J. k: l# F% p& y fresult += b1[jj] * b2[jj];
5 I4 C& U* J8 w3 h( a4 ~# K5 A }
M$ R% e) [1 X, @3 O8 l8 Z6 G: I) ` */ {$ v* c. w$ z! Y% a: i! I
& Q3 q5 V3 I. A% j) b I3 L$ F //Method - 4 202s) L5 H% M# A e4 I* V; n
/*9 a5 `) T x A0 p- F8 ?
for (int jj = 0; jj < N; jj++); T' n. B& r5 ]$ r6 Q
{
; g8 U9 c% V5 u0 Q9 U S& X; U; j6 _ c
}
# p! I1 l1 G2 M( F */1 T4 L, _* L( ~1 T
//comment out all methods, N=100000 202s 3 P) `2 s. e5 v/ _( M( P
}# S& C7 P( \ U. w
% P5 w/ A9 {- V7 [
delete []b1;
% G/ U+ y$ K: h9 e delete []b2; 5 ~) w- g/ l2 S. a; K6 `2 w$ R+ M
|
|