TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 ( e( P# y# V% }/ a
@, G$ S' @7 B% w" [
理了理思路,重新做了一个测试。; e4 p: b3 {- [2 O1 k6 d1 t* D
做了两个 vector 和 两个 float *, 都长 100000: f3 c1 f' B% s5 I* t* k* |* n! y
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.9 m& X- x( H& @: ~1 g: j- y1 t
. A: Y# l* k+ G; d
内循环试了4种方法,( d& G; }. F+ f8 [
1. 直接调用 vector inner_product 247s
2 x, d, l/ P+ ?$ A" H2. vector 循环点乘累加 237s
9 l- |) T: k6 a3. float * 循环点乘累加 204s
% R# ~6 N. e7 x/ P' B6 g: Q. `4. 空循环 100000 次 202s
1 b5 P y' W* l) o0 v) y/ q/ g4 g% }. k! ~
不做内循环 200s
- e- U! h+ S- B/ m9 o8 t
. K% n0 t' R+ W9 @- h3 G你昨天说的对,内循环本身占比是很小的,大头在其他处理。
. A+ X2 r# }9 I" V0 f另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。. X6 t5 I `+ K7 F
3 `5 r& V" r; v. j7 ]
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
% ]& x* G5 Q I( s J$ n6 \, `) I' V: ]1 _
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)0 z, J4 [1 G( f# ]- c
: D4 X9 J" \2 O2 `- X( B
std::vector < float > vec1(N);
2 j3 J& @ P4 _ std::vector < float > vec2(N);9 s# f [; M4 S( Y6 `. A
float* b1 = new float[N];, f% ~; Q6 R' ` a4 n( z
float* b2 = new float[N];
! F! ]- s0 I5 b# w! ^! r! G% e$ ~ M, J6 c9 M: J. h
for (int j = 0; j < 6000; j++)
- h' j0 @# v+ C3 y0 z8 F6 h {
0 f2 M6 R0 D9 Q6 M! L# W std::generate(vec1.begin(), vec1.end(), []() {& ~- T; p% J! U+ K% T; S
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
2 l3 U: V- B6 [/ ^ });
4 [! G' Q- ~- s# X
: m7 Z- h) f3 E( p* { std::generate(vec2.begin(), vec2.end(), []() {
0 m# m+ g6 z8 |' r, J. Q return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;, r" r( M2 N3 p! o ]+ `
});
1 P0 }, {9 B2 j _) e& u
0 @4 ?9 B% Y. A, z* R+ v for (size_t jj = 0; jj < vec1.size(); jj++)1 J3 n* I" a- l. { G
{9 I' K8 C2 F/ o' [0 E0 R- J
b1[jj] = vec1[jj];. B" l- B# \2 |4 C
}
0 A1 v# n2 k! h( L* T$ g- R* A6 y8 E8 ]
for (size_t jj = 0; jj < vec2.size(); jj++)
' l0 l+ l' [1 k { ]! ^) w- T* U+ x# q( W
b2[jj] = vec2[jj];* g W1 U( F# k% x6 m
}* [$ q5 X% R# Q4 i& E U: r
T6 E" y g8 q
//Method - 1 N=100000 247s ; P' \7 S( F9 z' K
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
1 r X) U1 ~6 o: K ) p& G4 h0 W4 I- }
//Method - 2 N=100000 237s: ?/ ?: J8 t6 o2 l
/*
. c7 ~: S2 x8 {) J for (int jj = 0; jj < N ; jj++)0 j+ m& t) j9 G5 r3 T& e- C
{
- G7 ?! v- b9 ]; ?! a% Q) Y fresult += vec1[jj] * vec2[jj];+ ~$ L- S% f/ I% x
}1 K, ^4 }$ ~7 F' ?+ N
*/
* d9 q0 f' h4 A! V $ k7 @& m7 h/ X/ c( {9 c; A3 d
//Method - 3 N=100000 204s
* |# [9 I* G- R /*
6 m" j: D; [0 a8 B for (int jj = 0; jj < N; jj++)
7 ^& t6 Y" j- v8 X {% i2 v+ C4 w' L$ v" D
fresult += b1[jj] * b2[jj];9 m4 @( X$ i2 J$ z( ^
}
3 H- n# } N6 e `! t */
7 ~9 L$ ^- D5 A' x0 r9 ?; H, T' [$ j7 V3 B0 `7 E) h7 x) g4 h) j' b
//Method - 4 202s, Z9 f1 H2 l7 V+ P. S8 ?7 {) x, [
/*7 v4 o: V' y4 j" x
for (int jj = 0; jj < N; jj++)3 n2 o. k/ |' h8 J1 i8 h6 B z' {# @
{% @0 Q. C: t# e0 r
, c6 P) S+ ]8 ~1 h' b } ^; k1 a- N5 B) M
*/. c9 M; o8 Z: r/ D9 V/ o s
//comment out all methods, N=100000 202s ) ^: D; S- F W3 w/ Q3 t, q
}
6 M' D& F5 ~7 E$ q* G( p# R7 i
% G0 V3 w- j# Y! s9 G. A0 l delete []b1;
# c/ @6 b: Y9 ^ delete []b2; 4 |. H* [# J( p( `. K5 i
|
|