TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
' s, a" O( h" m% m( _
; L, s; M, ?& {& N1 e7 W* z" F1 U理了理思路,重新做了一个测试。
6 ?5 G% n7 x$ l) h1 }做了两个 vector 和 两个 float *, 都长 1000009 U- Y; u1 r+ R
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.. O0 c' }# C2 ~! Z8 S# V4 z
5 W @+ Y+ F) R# V' z8 w/ ^+ W0 r) e内循环试了4种方法,
4 b5 t1 l7 z9 n6 J2 s( Y0 Y- P1 g q1. 直接调用 vector inner_product 247s
! r/ _' h. f' Q2. vector 循环点乘累加 237s
6 h1 W. w0 `! r& v9 |9 a! X3. float * 循环点乘累加 204s
9 G) m! h8 o+ U0 X5 z8 \+ M1 L; D4. 空循环 100000 次 202s& \; `& ~4 U; c3 x* o
; h t$ }: m$ O& R不做内循环 200s/ Q2 F# }+ E" |" \9 Z$ n( b# ]
& D/ p0 p' w. s4 T( I你昨天说的对,内循环本身占比是很小的,大头在其他处理。3 C- H# _/ F) n, R+ J# X: j6 t
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。2 D! E% T/ f* C, R+ v- q1 s
7 V7 M% y& L( m7 ]5 T! s/ c- p
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
+ Y- U" j; y4 O8 V0 z( u: I: d' W" c. B. L
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
* l6 g( h8 t" o R/ Q: U) C. J' e: Q( S
std::vector < float > vec1(N);
8 c6 g% F* D: F0 B9 o% d9 c, Q0 A# X std::vector < float > vec2(N);
8 O; [) ?& ]7 b6 e- u float* b1 = new float[N];
5 {( [0 T4 @: B) m# f7 Z2 \2 T float* b2 = new float[N];
- ^- \( k6 H% Q8 O) P$ |2 t% q8 h% P+ v6 Z: L, R
for (int j = 0; j < 6000; j++)
/ W, |+ U8 ^) p {
" L' G' ?% u1 G5 T: G) ]$ r std::generate(vec1.begin(), vec1.end(), []() {9 G" x+ b4 d' o, T
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
7 X2 j8 @* m7 R! F( }# H });
# [9 y& j9 Z% R- V- z4 Z( n6 O& G: \) I* [
std::generate(vec2.begin(), vec2.end(), []() {
( G* d2 n6 A/ m5 b return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;: h3 n9 t0 H) _ S% R
});
$ O9 y) z1 M4 H+ k. `
$ v0 o, ^( b% x6 s* s( W for (size_t jj = 0; jj < vec1.size(); jj++)5 S0 W* }9 [* q: I
{. T/ Y. _! y# o# X I4 X* {: L
b1[jj] = vec1[jj];
4 n1 Q3 x# r( W }% _* P6 @5 A8 p; V3 W. c
3 m4 i4 r4 ^. M2 J- w8 u for (size_t jj = 0; jj < vec2.size(); jj++)
' z' `8 L% A* p- b) ]' X. \ {% f- F9 l5 S& S; f2 ^5 w. B' e8 U
b2[jj] = vec2[jj];$ v' C) Y& O3 U D
}8 k/ O2 u' J- g- J4 w" @) U A
; I1 I, c1 Z* m) S/ N7 J4 ] //Method - 1 N=100000 247s - Y. A. y' Q9 f7 E4 m6 g2 G
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
& b; k9 v1 {6 m ' f! M) e% ~3 F$ Z& q
//Method - 2 N=100000 237s0 e( p" F5 G# l; u# t# Q
/* \ E2 \3 j& v# X8 n
for (int jj = 0; jj < N ; jj++)
+ u* A6 K5 ~" S5 C; I% u* J$ m {1 ?& H9 v: ?4 ?
fresult += vec1[jj] * vec2[jj];! h- S) _( ]5 d _8 B" {
}- H; |3 w- g8 H j% Z( u
*/
& A% w; D2 V7 B" t2 A
: v+ b9 n: w. { A6 \/ {9 g //Method - 3 N=100000 204s! ?: c6 k+ }) }5 p" g
/*
$ k1 @8 E; Z$ L% U8 A0 C for (int jj = 0; jj < N; jj++)
: H' ~4 |9 c. t {
4 c0 i* A! A6 {: a fresult += b1[jj] * b2[jj];! E1 w: n1 M$ Y/ G1 |( p
}2 z) L, U3 ~& l8 e. g
*/. L# C9 t4 A W8 y6 E0 t* w7 Z
! k: C- a/ m& m# k+ g$ ^, F) O
//Method - 4 202s7 g2 i# I' m; r. S) [
/*, s5 {9 p7 ?; @! {
for (int jj = 0; jj < N; jj++) y# Q( M5 O/ v6 M2 k/ ~- U0 N
{. _* R% y. H: o2 H j' `- E
% Y7 F( X2 S: |
}, l6 v; [& }" T8 E! B! O/ q. c
*/
?: Y( S) f' F //comment out all methods, N=100000 202s
8 ?! p" z$ s" K; _' Z2 r- A9 O$ a+ H J: x }
! b; z+ G) I* Q' |7 l; B
% d! ]2 |7 D" Z. U4 A1 H delete []b1;
0 B/ c+ l( E: o1 n3 @5 i delete []b2; 8 p* I4 x" s7 `. g
|
|