TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 + s1 o( ~' h4 b" A; r l% T
! V( s0 d* @+ l# r" s8 `理了理思路,重新做了一个测试。
3 k" |2 S2 v! I+ u( D做了两个 vector 和 两个 float *, 都长 100000; m% f' x) z6 U' B
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
" B l0 @. N5 G" F& n7 h! K6 T4 ]: M" f% N
内循环试了4种方法," a! g! x2 [, r9 ~7 f$ V( o
1. 直接调用 vector inner_product 247s 3 l' U7 X9 M6 X# ^
2. vector 循环点乘累加 237s$ Q. ~8 w( C$ U5 w2 l& l
3. float * 循环点乘累加 204s( Q2 }/ u2 c2 M- ], X6 W
4. 空循环 100000 次 202s
4 J" I! ~9 x9 k) F b! @1 a* f
- n4 m8 x3 l! ^1 k, M J) l不做内循环 200s- D* M* u9 L$ v9 F
* {% J& S9 A; }: Y+ c y你昨天说的对,内循环本身占比是很小的,大头在其他处理。3 x* p2 w8 @/ w1 M. X$ h! A
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。$ ~' n# F, D5 {& `/ ~8 l
% u- W. ]9 i7 I: M* K* K+ v$ X至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
& T, S5 U: B; s, _1 |# m- [5 v
/ q: y8 i+ B* U4 P4 V+ I9 D" \: v, e; Y3 m; H(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)3 U( e1 a- m+ T
$ C$ t8 f9 |/ }; y( G
std::vector < float > vec1(N);
9 V9 n. s' [) o+ b6 Y/ ?6 N0 H( Q9 E! H std::vector < float > vec2(N);6 b! v% y% l2 z! Q$ a1 z+ a4 u: R
float* b1 = new float[N];; N( V, v# s% s
float* b2 = new float[N];
$ s5 t8 r3 L, p
6 U7 N ^/ x8 r# m( ~2 h for (int j = 0; j < 6000; j++), S0 z3 _& s+ S$ Q" E
{5 @7 a. |4 E# X5 X2 E" {& F
std::generate(vec1.begin(), vec1.end(), []() {& s, I2 Z. e: E8 _( s
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
% z2 w( Z/ h% s9 O- W });
) @9 x" R% o2 Q& F8 q+ }2 i2 b$ j, t1 [. x, a
std::generate(vec2.begin(), vec2.end(), []() {
8 J( T2 l! q( ~' b" T: q+ w return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
) j& u/ a0 z& d. {, L! e( Y });
0 [3 C! _! r' e+ a/ v& h, H# u9 j# P' v3 f' d& Y0 M( Z
for (size_t jj = 0; jj < vec1.size(); jj++)% I* h. j+ Y M/ {
{5 p9 I" w+ n: W3 A9 n, l; \2 g
b1[jj] = vec1[jj];
* n# A2 S3 i- [, V% T# M8 w }
. d6 G! @, O! l3 U I2 Q' e- a/ P. Z6 m' y) y) z% d
for (size_t jj = 0; jj < vec2.size(); jj++)
) Q6 \' F1 B% T# n" B {6 ~& b- @7 ]5 Q, ?8 m; }
b2[jj] = vec2[jj];4 x# p9 b7 F$ ^, e! T0 X
}
% i0 |4 |! t! K9 ^* R3 F [. l
5 v& v6 ?! i$ b) t' J //Method - 1 N=100000 247s
6 q$ d) ?; k; \$ O) Z0 b //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
2 U- a# n$ C3 r9 b7 U; b8 M
: p' a" m$ T9 T2 ?) b( B) T0 R //Method - 2 N=100000 237s
+ Y0 i2 I+ _0 C" H /*
" G# Q% p1 M# Q9 ] for (int jj = 0; jj < N ; jj++)! v% v3 [, t+ O2 \) p4 e, f t, \. e, t
{
5 K! @( W8 m# O$ m- j* ^; z0 O- S! J fresult += vec1[jj] * vec2[jj];
0 Y" M" }- ^$ J5 @. M& m$ F! B }
h' L8 z6 i6 u6 Z% j! ~. b. H' o */; a# j5 d+ Z! M0 b, A8 W% b0 h
' o* I4 w, X- O P9 k/ [' | //Method - 3 N=100000 204s
9 [9 Y& {5 T- b9 m' C, D- D /*
; I- t9 j/ ~& c9 x+ W for (int jj = 0; jj < N; jj++)
* {6 D8 K6 @, O5 g% D3 Z; a! B {
7 [& p: |& Y: n6 G" Z7 h1 d0 r+ ` fresult += b1[jj] * b2[jj];0 J/ a4 a2 v, S" j$ d3 w8 m6 g4 l
}9 p( i. n/ h6 q. r& A0 j
*/6 J- Q: S$ f" H0 E+ I+ i9 C- t0 y
C( }4 ~ \% n; w; m6 H
//Method - 4 202s$ Q* f- |' o$ V. e( r
/*" H1 Z; o* x1 }5 N+ N
for (int jj = 0; jj < N; jj++)* G# F/ f, q7 d' _* V5 I% h
{, f8 J2 t- V$ u/ e1 [# p, ^
& H X* L& ~5 c# O
}
& d3 e& A6 \/ _3 s */' c6 J/ ]! {5 j K& ~( x" I
//comment out all methods, N=100000 202s
3 [3 ^1 Q. e, F/ A& \ }# u' P- A* ^- ~* h6 n
% l( j1 E' n/ a delete []b1;* ^. U. s% @5 m7 L' R* v
delete []b2; 9 E: m2 w/ e" S, Y! N3 W" h- b
|
|