TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
2 F6 V$ y3 d0 f* p' z$ I, @+ t/ b& \/ C! h) n" Y
理了理思路,重新做了一个测试。
! d- G0 P" a3 i7 {6 P做了两个 vector 和 两个 float *, 都长 100000, R3 L2 l; \) ]. F+ [% E# I& D
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
8 D& Y _% r/ q4 G$ E% p+ ^5 z% X/ u: X- |. W
内循环试了4种方法,1 w% | Q7 n. ?
1. 直接调用 vector inner_product 247s 1 ]9 ^6 p" C% r# N; h) [
2. vector 循环点乘累加 237s2 a; E6 c0 k% ?1 E
3. float * 循环点乘累加 204s
* t1 y4 o: E+ S4. 空循环 100000 次 202s
+ B: L- {" m6 Q: w. L: N G# W8 |1 C) p& M
不做内循环 200s4 ^' z2 m) u# Y! y% i) X1 Z( [
. P* @1 m* _% d+ l
你昨天说的对,内循环本身占比是很小的,大头在其他处理。3 j0 T( n+ `" V4 y2 T" H
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
, X! K' x2 {; B9 _4 G, x" Z3 T
0 R$ j" ~ a3 X至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
9 k. m( m `5 ?5 l6 A, o
7 \3 G* i" w' V6 E" v(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL); y- p9 E: f( E% L
/ D, Z0 @5 w, B- {" t+ }4 K5 a$ Q std::vector < float > vec1(N);9 W; q! ~2 ^! U" D+ e B
std::vector < float > vec2(N);$ L- |7 E% D5 i) _9 T& s1 @
float* b1 = new float[N];
+ c& s4 K$ }$ b# z. X! f, ? B float* b2 = new float[N];
2 Q; k8 i. g/ o, m: l; x3 S. K
% X/ d d$ s$ A. r for (int j = 0; j < 6000; j++)) P; ~" ^) h! b' @
{# r7 R0 s" I* _7 s4 ]2 O! H
std::generate(vec1.begin(), vec1.end(), []() {
3 \% V4 D" Q& I: S1 l3 L! Y3 v6 A0 Y return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
$ r$ J. v+ {5 J+ J* B( G3 j8 K });
; c4 ]* B" A5 ^# d, x) {5 q) q9 ^- H( T. A* v4 E$ q7 x
std::generate(vec2.begin(), vec2.end(), []() {
. Y! v- S3 i& r& P0 f, Y7 q return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;$ Y2 g' c" H9 \& j$ ~/ a: b
});
! N0 B9 |$ ^) d2 ^
6 m5 e9 I. O+ R0 T% k for (size_t jj = 0; jj < vec1.size(); jj++)
5 t5 ?6 K! `% M0 q; P& J# Z {7 B/ G# f" A+ g% s
b1[jj] = vec1[jj];, G. ?2 P3 n! N( b5 ~9 j7 T
}
9 E: f7 U! k- w$ U5 O5 y
) q) n1 ?2 ?3 s, r2 U4 Z6 K0 A) \8 U for (size_t jj = 0; jj < vec2.size(); jj++)
: [/ z: {( J" H8 U* f/ ~ {
* L, D& Y$ r1 `) x% ] b2[jj] = vec2[jj];
z& R1 H! S7 q0 x9 ]) _ } a% w+ w3 n5 U3 g+ i
3 j9 r1 S2 U) x/ ` //Method - 1 N=100000 247s
' b/ I9 R$ a3 |0 B* R0 w //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
: a& W6 V' Z- I3 ~4 n) I * s0 d/ m1 e3 u
//Method - 2 N=100000 237s" z" v) L9 @5 ]
/*
4 |. |/ r1 G7 s8 \# H for (int jj = 0; jj < N ; jj++)% \; N% z7 L. T9 z+ b
{
# P: s& H2 ~9 t! j2 [, B0 n! h* g' F fresult += vec1[jj] * vec2[jj];* `% B& k/ D, i5 [7 A0 h1 F& k
}
# ?$ `8 n7 x7 X" l% q */) l& b8 X o/ U* c9 B
T* Z( R3 V# I1 M6 j0 S. ]: N8 r, n //Method - 3 N=100000 204s4 G! `" A5 z9 j
/*0 {; V0 u5 z: H
for (int jj = 0; jj < N; jj++)5 P! A) N% b8 y4 f
{6 j d% C9 j4 X @0 @
fresult += b1[jj] * b2[jj];3 j, t( q. Y P' {! c+ J
}4 c' A' |' T' I! M& T0 m- L
*/+ O3 Z0 U; [ @) A' p
5 T, Y' r3 p) y5 y4 m: q m //Method - 4 202s
8 \1 H7 u0 z* L o. I% I5 `9 L /*% y% x+ l1 M4 H, a3 N
for (int jj = 0; jj < N; jj++)" w1 c% x0 W1 K+ z; q0 Y
{0 w" I4 I6 }- R0 y
8 U5 v2 W& n) H% R: A }
+ b& U) t4 U) S" t5 d3 G9 T */- L5 A1 o5 ~" Y) q0 f. o: b( v
//comment out all methods, N=100000 202s # v. H5 \$ \3 J7 F* s. e
}
7 O+ y7 W2 D3 Z- H3 i$ [# m) l- {6 u$ \5 w: \' h
delete []b1;
: b+ V' v* h) E' q delete []b2; 1 R7 D% r1 N5 C" n* a) b, y
|
|