TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
$ K$ P2 L7 k5 Y4 @5 y, ^ S+ O# W+ X1 z* K
理了理思路,重新做了一个测试。" e7 g: X: s4 o5 E: D
做了两个 vector 和 两个 float *, 都长 100000
9 ]+ ~2 A5 c6 J$ y' S0 P2 O外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.& ~5 u1 h1 A/ y/ R% @* e
0 `9 S- {) c6 e8 g1 {5 l4 z% t
内循环试了4种方法,
" }# R2 [; L& R1 H; U% a1. 直接调用 vector inner_product 247s
8 a' T0 A2 l# u* w( |( _: g3 u2. vector 循环点乘累加 237s* C2 f$ `$ R& s2 F3 h" h1 _: ^3 f& ^# @8 F
3. float * 循环点乘累加 204s/ l, m3 `+ x2 b% R, q/ j+ d
4. 空循环 100000 次 202s
& d2 E0 h; V! l0 N) }1 i. N
4 \5 M, h8 t' V不做内循环 200s$ w' r6 L0 b, Q0 _! N
* p! m- p# B8 n1 Y
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
B' O/ Y) X2 s5 q2 _9 y另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。% t1 _: K' n; r. c
) U% x1 ]& \7 P1 n1 r/ @7 a v至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试). X/ C5 J1 ]" @( z9 G
5 m; p1 A6 L( M5 p/ d/ q+ d
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
4 Z- p7 \' t) ?1 c2 P) P. ^! G4 v" R/ n3 P0 z
std::vector < float > vec1(N);
) F+ l" z/ m3 m: s' R: ] std::vector < float > vec2(N);) A+ h" d, N$ q
float* b1 = new float[N];
& n! m* Q3 o1 Z f float* b2 = new float[N];! |2 ]. x; F( _1 ^6 I
* m; y7 U: a3 u! G. V
for (int j = 0; j < 6000; j++): {4 V3 I8 x; m; }, C* t0 ~% W6 s5 z
{ T; W4 f- g7 a7 K! F) t
std::generate(vec1.begin(), vec1.end(), []() {6 W' v- A P% C
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;+ b; S' i! t# p/ K) ?; F) V: \
});
! G! u$ w$ N3 m* @# e
2 h- D/ }3 m& q# N) g2 ^- S& c. ` std::generate(vec2.begin(), vec2.end(), []() {7 A. H" }( F- v
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;1 U) k4 t) x% g) Y
});
: ~; X; p4 V0 h' i" t2 h2 U& |$ ?! c! F
for (size_t jj = 0; jj < vec1.size(); jj++)' |* y/ P$ [& q Y. j
{& L# H4 P/ W0 S
b1[jj] = vec1[jj];
8 I# @+ a1 z5 O }! {, t( H8 D3 `& f
7 F( F' E3 C5 m( D* Z2 C for (size_t jj = 0; jj < vec2.size(); jj++)
6 }5 `& G2 L0 T( V$ i {
9 I$ t5 N. b& L b2[jj] = vec2[jj];
( q) x) R. c8 i G }5 q1 \: z& e0 A& X- r; y: x$ S
3 R4 C1 i9 F! {0 X( g
//Method - 1 N=100000 247s
: d2 N' D# e$ K) g ^- C) o2 w //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);/ I5 n8 Q- n; Q; E- O0 `- z" T: G! ~
! {; j" w) W" [/ I" } //Method - 2 N=100000 237s. G' {9 b3 |+ k# _0 T% N5 D: T
/* h2 R# H! U! H0 k u4 u
for (int jj = 0; jj < N ; jj++)% F* ~; m n0 k( F; G
{
- `- @1 h1 F Q: [ fresult += vec1[jj] * vec2[jj];1 K' {# m/ d) o0 g; F5 w5 d# N& A4 D
}
3 F3 ^1 _: |2 X) V6 j: U */
S; r5 R5 p0 `' A1 _- S/ x6 z6 W 4 w/ G2 W% G. j# I8 Y- W
//Method - 3 N=100000 204s
& N- r; E8 x2 j$ M4 n /*
2 M2 w2 J: a* v8 B for (int jj = 0; jj < N; jj++)
* A4 g' Y' q- k8 b9 C {1 E/ A2 C4 O/ U' Z/ q# ~
fresult += b1[jj] * b2[jj];
6 S2 C, U- U" i6 g) I t+ |5 r }
! P9 `/ d1 D; l7 T" g */
1 Z* T+ F0 C3 A, F
y1 Q, }, V& i+ R) s0 J1 }* v //Method - 4 202s7 d6 ~7 j+ P5 o+ A0 ]! T1 z2 t
/*) Y& C- L) [; U. S9 v* r g
for (int jj = 0; jj < N; jj++)
5 G8 L7 M" S+ a! o {, K4 b( s" W+ g ^0 f/ n; }
9 C. A+ `: H% A5 |' Q. Y0 w& Y
}
& R- j' }4 D3 y1 q" m- p */
( K7 @* x* e+ S( x //comment out all methods, N=100000 202s # K& h- b. d. S- s$ j; r9 F
}
2 P/ ]; z7 V1 U$ U# x1 D h1 p3 y x6 i. @ ]+ s6 y( u
delete []b1;" a# m6 X1 \3 n4 [* f n! J U8 o
delete []b2;
) o1 x, G1 l3 Q& X( H' f" I6 @! O) |3 T" \ |
|