TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
. R! i; M' K, y2 c! V' @0 P$ t/ M9 E. f
理了理思路,重新做了一个测试。
, @1 X9 P$ f& t% B, J5 G( l做了两个 vector 和 两个 float *, 都长 100000
3 Z1 b d+ q* A& L/ N( a外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
) K5 L1 p7 `4 i/ }0 M( V; b% u
3 A1 X3 W3 M2 b y内循环试了4种方法, s! i: I, ]% I+ R4 M6 U0 X* c1 p! I
1. 直接调用 vector inner_product 247s
8 o, R+ _/ N8 Y8 M1 M3 E0 Z2. vector 循环点乘累加 237s
2 G% [6 }4 a0 o' W; J2 V3. float * 循环点乘累加 204s$ K' {, d6 |0 v q" e" H& \% v
4. 空循环 100000 次 202s
z( a! e0 {# o9 G' H4 ?, c$ D4 F
5 I G6 F* l, R# C+ b% c0 F' G" P不做内循环 200s. i" r) H! Z# A/ W3 {$ J/ i& O
- E7 |# M2 o8 d, R3 s+ H
你昨天说的对,内循环本身占比是很小的,大头在其他处理。( _' e- C$ m, f* Z: `9 N
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。; e; F( _" \4 r% Q. C+ Z
# A' x, l( b {: P! D9 S9 T! {1 v4 b至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)* b7 `/ M' H: |' E2 P% Z
4 t: ?) x4 x/ c+ `0 k* H" ~(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)% m: \" w5 g$ J2 y/ x$ x9 K# }' l) ^
4 H* n" L2 y) C0 @
std::vector < float > vec1(N);+ W0 |7 B' v% a7 ~% t, a
std::vector < float > vec2(N);( S6 k0 T& Y. a! N9 F8 I
float* b1 = new float[N];$ M1 R4 N7 W4 d" k, W$ B; a: [% M
float* b2 = new float[N];
+ }* U2 z) d/ C2 p( S+ b/ P U+ @$ L1 R' I, X' ^
for (int j = 0; j < 6000; j++)
4 u9 ?; \' t O9 F `, ~) u {
@% S6 j+ w) e$ g std::generate(vec1.begin(), vec1.end(), []() {6 R$ l4 G( J6 ]" `% T& K
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
V6 [9 g3 C) R* N });
# D: l1 y7 p% B( P" ^" U2 M% H/ z9 B! z
std::generate(vec2.begin(), vec2.end(), []() {; d. O n Q6 E' \$ Q
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;5 s1 y- n- K+ j1 [- o
});
" h+ `& R! K; K. M2 L& O
@# x4 V4 f9 W3 m/ u for (size_t jj = 0; jj < vec1.size(); jj++): x2 @$ ]# I# h+ a# J+ [, Q a
{
4 ]* S3 l' `/ i6 M) o5 { b1[jj] = vec1[jj];
% d: f9 l5 ]7 {+ f: B7 F }0 r, t- R4 f$ p" z2 u6 N
: H% e9 i: b0 P; V7 ]' P
for (size_t jj = 0; jj < vec2.size(); jj++)2 E* s, f# E% D/ U2 ?' h: c; q& w
{# c1 [6 l5 Y: A1 L8 J9 f" o
b2[jj] = vec2[jj];' k) e* p) u+ P/ J9 F
}
3 K, v4 k8 S: S. i# i; x. C2 P" j7 g% B( }4 G$ j7 O, [
//Method - 1 N=100000 247s 7 j% ]+ G7 q+ }
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
6 o7 w! H, m. v& |5 ]6 \. ` ' C' c1 ]2 Z- b8 D
//Method - 2 N=100000 237s
: n5 v7 q6 K2 J3 a3 k /*9 D9 }- \1 K4 f) v" C
for (int jj = 0; jj < N ; jj++)
+ c1 x% V8 j2 T( i$ t' }/ @; O {+ @& p" L' n1 @3 b
fresult += vec1[jj] * vec2[jj];5 ?' ]( ], z) O; ?9 O ]
}
/ }/ H a; v; }& N8 Y/ F */ \8 O [. I' V+ {
& h" @6 B4 [5 l- ^5 F //Method - 3 N=100000 204s. M) a* n& R# K6 S$ E$ D
/*
5 H& k* m6 J, q7 L2 M% I for (int jj = 0; jj < N; jj++)
8 a7 [4 B: ~' ] |$ C {/ v4 S7 A( E5 D
fresult += b1[jj] * b2[jj];
3 ?# K2 Y+ B$ G" C+ K8 ? }
7 a1 V v+ M$ K. @ */% D: u* ]2 p. C9 R) R
) _2 f! W6 V+ O8 O% d, u
//Method - 4 202s- E' O9 L3 A0 F
/*
; |7 ^# s! {3 R } for (int jj = 0; jj < N; jj++)
7 [ _ _; V( q" g9 c1 T3 ` {
: M! x$ u1 m5 T, _$ R4 r6 V
& k* b1 a& d' N# a; } }
2 _" Z: i1 Z( [. M: { */
- X; p* D& B9 ]. }9 s //comment out all methods, N=100000 202s
3 M; r# u8 f {$ d }
% f1 {/ d% W, f5 U5 x8 \
8 w! `( f/ h+ `3 w/ q delete []b1;
2 E. G2 P" ~3 @+ n% P2 I3 j delete []b2;
5 @" P, V0 o z) u! t5 E$ {3 b |
|