TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 3 y8 v1 K4 X( j1 B) p
- e7 y) d- V; Y理了理思路,重新做了一个测试。
* _& g( |% y* A. {0 N5 B做了两个 vector 和 两个 float *, 都长 100000" B" Q+ t7 j2 G, | s
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.+ o0 S2 R+ g$ W* @1 Z' k
9 T: I7 f! v% E. [. `) Z2 T9 I
内循环试了4种方法,* U7 I/ L( A5 J* Z
1. 直接调用 vector inner_product 247s 1 b$ Q( o& p. x$ m& v/ b$ w' k
2. vector 循环点乘累加 237s4 F; U# Q% ~9 @0 Z
3. float * 循环点乘累加 204s
( D$ W# z1 s" p! T# R7 u& g4. 空循环 100000 次 202s0 M) |0 K+ t+ |
3 _9 q) z3 W u
不做内循环 200s
' S p* r. ]# H2 U. V, i+ } y# F2 o9 E! E* G7 X3 ` L' _
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
8 l8 A- ` L0 z另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。/ B; E9 z& E1 Q! o% z
, c3 A( F& e; p: T4 }! t$ l至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试): Y% s& Z2 m, C3 a3 I' r8 q
# i6 M0 X3 t/ L% c7 G
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)9 y2 x9 y. j3 M1 F0 r# |/ l
% V2 w' l R; P% o" f' z! \) g1 `7 t std::vector < float > vec1(N);' Z0 ^# K: v" q2 |) |$ M O
std::vector < float > vec2(N);# d' n2 \8 G' l2 M' v1 E7 K& y6 K+ z
float* b1 = new float[N];) k6 ?9 y4 w# o! B* \( f/ Y7 p
float* b2 = new float[N];
, O Z( I/ I( r; D! _' @+ a, _- p% U; R9 b6 J$ v
for (int j = 0; j < 6000; j++)3 D& l$ ?! E4 ~( {0 |- M
{; S- p+ v2 ?* l
std::generate(vec1.begin(), vec1.end(), []() {
$ z6 z @- J% C8 S& q7 z1 T return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;; {# E' [4 {0 f0 \9 |
});
/ g# f$ T1 J; L
1 s g" i; r6 k/ P( d8 U std::generate(vec2.begin(), vec2.end(), []() {+ k1 F' k/ d$ {0 ~6 V# ?% q1 C) U
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;8 W$ m, ?7 ^9 t0 d
});$ U! \! I. e V2 Q( L
2 Y1 M5 p! {/ `& v8 {! F
for (size_t jj = 0; jj < vec1.size(); jj++)+ j) D$ n4 W' S& U5 X
{. N5 t: t, W% K+ f
b1[jj] = vec1[jj];; E* c$ `2 {2 Y) b2 W# s
}
$ l. Y2 r& D: {( s1 [% ]! l4 D: k& F' q% Y! {' V4 {
for (size_t jj = 0; jj < vec2.size(); jj++)1 l+ H& ~. ]+ A" Y
{; q1 v, s. A3 \0 v" X
b2[jj] = vec2[jj];! E7 @& W. f( S3 o8 J2 f6 f/ x, f
}
J: C2 t' V# a$ e8 P( c: p' W4 }# {5 y, V0 A
//Method - 1 N=100000 247s
8 c; \) B! b' _( t0 q0 @" _4 [ //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
: z2 Z( @4 {4 x r9 q/ i9 { ) f( g. @% [' o: E
//Method - 2 N=100000 237s& A+ s& R. s0 m! a: a
/*0 U( Y0 R4 x) l# L
for (int jj = 0; jj < N ; jj++)
& ~7 ^7 V) t* m0 I' w& t F( F/ U+ l {' i0 |# h1 z; e' u3 l2 ]
fresult += vec1[jj] * vec2[jj];0 y- l* q) Y! Y/ H( D+ ]! g! A
} \1 O2 \) u1 `6 Y3 s' ~
*/5 o( S7 G7 q# r- H
# g' q2 b" B* Q {. P/ U& t3 ~
//Method - 3 N=100000 204s
6 K' n8 a3 M) k/ B e* K /*
, W; ~; G1 X! s r+ D for (int jj = 0; jj < N; jj++)
# H$ E1 ?# l, c4 i {& P" S" l% @+ w6 t" X4 Y. J8 P$ X5 i' B
fresult += b1[jj] * b2[jj];2 ]# f* S# E# U* f) H, g
}/ t* K6 s( I4 N
*/% Y% x, q# r7 A" z! d; F6 v7 Z
! c9 r; z1 X6 n- K' n& _) A2 n2 E/ v //Method - 4 202s
# o7 k1 b- N1 M /*
: K* B$ v" e$ ?4 y& a2 B3 A for (int jj = 0; jj < N; jj++)
) X b; ]1 b3 |3 C$ S8 I {
7 m6 ~( f5 E& [' q& _! d2 p/ [ * h1 L! G) ^/ ?' m; K% y: K
}; w' Z3 D C8 [$ i/ B" n& @
*/
; _ T7 q s4 k5 |7 [ //comment out all methods, N=100000 202s % V$ R; L% e4 z2 G& ~
}
7 i/ R0 K! C# X% E9 q! s0 q
2 F. ]& G, ?2 G/ y- y6 I6 v+ i delete []b1;* J& f" v& [) p% V+ j$ b J8 v
delete []b2; 0 {+ C$ Z+ A# A1 ?% ~. a5 g
|
|