TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 " f' u6 y. @% ` _+ f
; K8 q- B1 j% u8 L) V理了理思路,重新做了一个测试。
5 ^$ Y! N3 ]$ q做了两个 vector 和 两个 float *, 都长 100000
5 l- }' L% A a5 H. m外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
2 @7 ^; R$ i, T0 N `! u
# I7 s4 S) V0 ^8 k( `3 C内循环试了4种方法,
* q& d1 Y4 D4 }* H* S* q1. 直接调用 vector inner_product 247s 7 R: J$ ^; B6 V6 f* i, d% i' [4 l
2. vector 循环点乘累加 237s s4 q: y* I: o: k# o/ v* w
3. float * 循环点乘累加 204s3 s! X9 ?/ X7 F+ W$ X1 m# d
4. 空循环 100000 次 202s' J- W& K% D6 H, @6 h' ~
+ e" k# l$ k0 O- ?, O0 r, l
不做内循环 200s, U" U+ A4 P* m; V( z2 Q; {
d+ b3 F/ Z9 _( K! C1 m' g$ q你昨天说的对,内循环本身占比是很小的,大头在其他处理。
, u7 Y! }& P& u另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。: W3 P# f$ Z. T7 w) w
& H( ?" D$ r7 ?; T& f
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)+ m$ i8 X* M# [$ s z a% s
& v; B q' f& ^4 @5 k0 @* ^) r
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL). a; O3 N0 Q3 D
8 E: B3 A6 ^' j; ]
std::vector < float > vec1(N);- B- v! |: @. [
std::vector < float > vec2(N);
2 a, ?5 P) @# n float* b1 = new float[N];
! \) G% w& c1 P' q/ B float* b2 = new float[N];
6 Y) y- S" T% e( c# |# n
$ ~2 f! q% C9 V+ ` for (int j = 0; j < 6000; j++)) ]) F% N* N. T; F a( f
{
& G: b, ~, S6 M" j std::generate(vec1.begin(), vec1.end(), []() {
+ [# ]2 e; O- B; l" ]7 g return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;. U. T. V. n( x
});4 [7 G' f# w/ K+ P( y/ j" [
% q' k* ^2 r- ^1 t* e2 M. A# U
std::generate(vec2.begin(), vec2.end(), []() {
2 ` }/ O' k4 N. X3 }) h return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
$ ~6 D% s$ w& f7 ]+ e- _5 A" m });" @ P# V. @! h r
. F2 p3 t/ L6 \) e5 Z* U0 ]
for (size_t jj = 0; jj < vec1.size(); jj++), h5 I) }( k: e* H# e9 p3 T* L
{
1 F) _# |: G8 x& T b1[jj] = vec1[jj]; j5 R8 |) ]7 C
}
5 V4 I$ S' b: a/ K0 ]2 h0 J3 i: q/ G) k0 ]. J
for (size_t jj = 0; jj < vec2.size(); jj++)
' d# ], I7 @' s0 n& b5 |% S- Y {2 h) s3 Z# v6 ~/ G9 @2 Q
b2[jj] = vec2[jj];: A- j# @+ G/ I9 _
}
+ m3 B* q8 i4 M/ W& m
. @ ^ f7 g/ F //Method - 1 N=100000 247s
2 K( {! I Y" ]3 ]' ?4 \ //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
8 |8 r* v$ q- w1 _- n7 t! e1 q, G
8 n1 ]5 q4 S% `8 t: S //Method - 2 N=100000 237s
- R3 d8 o# z% Q5 A# G$ Z /*: H b$ F; w/ X) n
for (int jj = 0; jj < N ; jj++)
& [2 H* `* _7 w: X4 L& r+ V9 R {
' p' k1 o- o0 i4 ]+ ? fresult += vec1[jj] * vec2[jj];3 ^1 g0 j7 p7 E/ F( P- Q
}1 l$ S- F- Q9 w5 h. X. R0 B
*/
/ P0 ?" |. c3 z( G* t+ [. p' x& T9 _5 m3 x
3 ~& K' j% K1 T //Method - 3 N=100000 204s' _7 t" T# V' A
/*
' W% ?1 j( s( l2 v" d% ~ for (int jj = 0; jj < N; jj++)9 @" v. p9 ]( D, ^6 \
{
^% p' `/ s* G ]: ] fresult += b1[jj] * b2[jj];: j' `& Z' k; o0 s M) Z* u, o6 r- I6 P0 Z
}5 l! _. J' W, i9 s3 l+ Z& K+ W! J
*/- G& }% w4 c2 T
( T& d7 P3 Y+ e* u //Method - 4 202s
b2 C! F1 j' [8 \6 b6 H; k4 g /*
# C* C$ {3 c7 c3 | for (int jj = 0; jj < N; jj++)- g& z- \* B9 `/ O2 k! s3 V% i
{& d0 y3 Y# ^, H' ?7 M
( F. M5 l% S( X0 O5 ]) f
}
6 c6 C* A8 l2 g6 J5 I) J: R */4 }2 p( P$ R( u) X
//comment out all methods, N=100000 202s
7 n! t$ F5 L" \% T6 S& J7 m }
7 D0 M% t# n( G3 }
+ L) y+ a) t5 J" d& q3 c delete []b1;
0 ]! w) Y$ ]6 z6 R* ]5 S# Y delete []b2;
# a- T6 z$ K& a7 b. A9 I6 z2 Y0 A* f" ` |
|