TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 % V, z2 C* W1 e+ v. u, b: p
( G1 P8 t( C9 h2 Q$ {& M, E
理了理思路,重新做了一个测试。
& t7 `6 p! x7 K0 P5 w1 o2 \做了两个 vector 和 两个 float *, 都长 100000
0 P! @( N( t z- P E/ f外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
5 g. R' `* t+ A
/ m; J5 Q8 i* A3 R内循环试了4种方法,
: [0 r! o0 M" B2 K) R1. 直接调用 vector inner_product 247s
. c0 r- L. y# C6 [# a8 q: G2. vector 循环点乘累加 237s! B s2 W$ e6 P* k/ b( {0 ~; y( q
3. float * 循环点乘累加 204s% M$ Y' `4 r0 z
4. 空循环 100000 次 202s
, }7 v9 H( }* p3 I
# ~0 W5 i" e9 W6 q- U& E8 L/ p* H不做内循环 200s
8 w! f/ W4 S3 G9 b- e9 ]
, @3 I+ V0 C. q: Z6 D0 z" y你昨天说的对,内循环本身占比是很小的,大头在其他处理。
+ r1 p. e; o+ k' z0 U另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
0 k, T- C/ ]/ W, ]$ G% }1 ^3 G& _: M( | d
" L6 U" M6 l. ], L) f至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)5 r8 ?4 s9 _/ p+ e9 K5 y+ R
# c- Y. a( X5 x0 s0 ~; H, n(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
% v0 X: O' _# K/ r7 ~. h/ r: v0 V; m+ b8 M9 T( c& }
std::vector < float > vec1(N);
4 E( h1 r/ ?) p t" m) L8 y% w- T std::vector < float > vec2(N);% M8 h" T+ @, f. M) u
float* b1 = new float[N];
) _4 h. y& o& p float* b2 = new float[N];# }9 b/ x9 I5 d ^' Y y9 c' T
5 i! \3 Y% `1 s* _ for (int j = 0; j < 6000; j++)' p, _& p& t, v2 J" l
{; ^1 V: R) C* `2 t B
std::generate(vec1.begin(), vec1.end(), []() {
+ K4 u0 O1 C, H+ W; P& @" { T return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
0 z9 {2 L- t: i2 n });
, r7 B5 G" x0 Z: f
1 j6 L* ~5 E! U5 m9 s5 _$ p0 ] std::generate(vec2.begin(), vec2.end(), []() {
$ y1 i* ^6 G: k2 P+ x; a! `6 Q1 _ return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
7 a3 }; S; P3 J });
7 l1 A* |1 y V# u: g) H5 S! ^
2 Z& Q% _* r- _$ W for (size_t jj = 0; jj < vec1.size(); jj++)
( c/ l6 A% z# |; I+ J& J( s {$ ~" U" [6 W5 D; a3 N/ M9 v o* X x
b1[jj] = vec1[jj];6 y6 I# [6 O+ a! k {
}
4 D3 h7 z7 @/ i% S6 S9 K0 Z( S, n& V% C
for (size_t jj = 0; jj < vec2.size(); jj++)
' Y$ {+ \! Q! l5 N {
% v) K! V1 O$ V b2[jj] = vec2[jj];
, j5 A6 C# Y4 ]0 P+ j8 i }7 A, R1 Z- W @ H) x
0 Z+ [0 ?7 _8 r+ O
//Method - 1 N=100000 247s
i4 P& y; \! |) c //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);% b" S) e; ?2 b( `7 ~. p
( Q2 N7 u( S, C" ]+ v0 I
//Method - 2 N=100000 237s1 F* |- ?( O6 o) G) L
/*
* S V" O% U. M2 `9 d for (int jj = 0; jj < N ; jj++)
. Z8 M, H2 t( f4 z0 G, M, L {7 ~2 o9 ?! E5 R+ _: W
fresult += vec1[jj] * vec2[jj];, d0 c6 s: c0 {
}) o/ a$ [# C0 ~0 W: J) C) n
*/5 k7 Z; i" ~* h+ _) e
9 a$ {7 k( F0 F& n: T7 Q //Method - 3 N=100000 204s5 v: E$ ~/ B5 M' y4 p
/*- v7 b% E$ B3 T( |
for (int jj = 0; jj < N; jj++)
" ?, ~4 n& N4 n+ x# _2 i# Z& C+ R {2 K* N3 p; e+ i" `. d; p0 {/ y" Z
fresult += b1[jj] * b2[jj];& ~" O( S5 d6 @5 Z) H7 [
}
: _" f0 ^+ P9 n) X+ M: T */% ?. V: [2 A& S' x3 P, i O) F. @. J
/ {# m$ ^' L3 `2 M- I! i+ Z
//Method - 4 202s
9 l9 {4 t) S5 l- F /*5 T8 l/ \4 ~( l, |
for (int jj = 0; jj < N; jj++)) p% ^) s; E+ B0 J" w
{ _* @) u& h3 a; @
0 }# Z. R! ~. y }
* X: `6 U8 m }6 O, d* b. A% r+ r */! E! i; @, D- _7 n, K j# M
//comment out all methods, N=100000 202s 8 o) X! ?; H8 u! e9 D J
}
) |$ k( A# ~$ v0 |* h& j/ X9 v0 }1 s+ ? i8 Q3 k0 j6 u
delete []b1;
+ L* K7 M }5 a delete []b2; # w- C. u0 r* [% `5 Z
|
|