TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
( l7 \: M, L0 w! g- |' S; w' X5 l- Y0 s! f
理了理思路,重新做了一个测试。
% K( H2 E& C) ~6 c; ?做了两个 vector 和 两个 float *, 都长 100000
3 j, z9 H8 @* |外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.: B }. g5 z/ o+ x( h7 I6 I5 A! V: K
, y8 u8 A8 B& Z/ J内循环试了4种方法," C9 G8 E( r9 E/ n9 Y' `1 A
1. 直接调用 vector inner_product 247s
: A4 H; J" h* r$ B2. vector 循环点乘累加 237s
[+ ~+ ^* h( g. ?8 V# m$ [3. float * 循环点乘累加 204s
9 t# f' R: b# p" c8 E, W4. 空循环 100000 次 202s$ D% D' G: ~2 I7 `
" c& X" O5 q/ S不做内循环 200s# s8 \9 J: s- B5 s6 L- p
5 A4 `! L* {7 N( g你昨天说的对,内循环本身占比是很小的,大头在其他处理。
& b; h0 p M9 Z/ k: A另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
0 n2 a& p" o" f" t+ Y4 A' c
( z, ?7 O8 z# c/ G# U! j$ p至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试). I( m7 f, |0 f/ m+ j
# B# y5 b& r: c7 F( M6 [0 k
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)9 D9 I& T% Z1 T6 Y0 V8 b
" W: C; x6 K3 `* L) O8 S std::vector < float > vec1(N);
- `& |7 Y& L. C; `/ _9 ^ std::vector < float > vec2(N);
( i" e7 s! d: d. a float* b1 = new float[N];) X/ Q9 _9 W' g% ^6 ^: ~3 m/ r" Q
float* b2 = new float[N];
+ |2 u5 [" w+ X6 h5 f: q7 x; d9 r7 Q/ e. r* s, I0 G
for (int j = 0; j < 6000; j++)0 q8 `, k* @% t- Q) C p
{
: A0 c. T8 X: n. k+ K3 t9 ^3 x; ` std::generate(vec1.begin(), vec1.end(), []() {' O$ B2 C" l8 t$ W
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
% P* R# Z6 ]: ^; I6 B9 j0 J });
, v9 f) y" g; r, O' w- p5 ^% i n4 d
std::generate(vec2.begin(), vec2.end(), []() {0 E" y1 c5 [, c" x
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;$ o& r) w0 \1 F" \* [3 Y
});
( [. Y2 r* X9 e5 o: X) N' K4 v0 ?2 w( f# P Q: u
for (size_t jj = 0; jj < vec1.size(); jj++)/ N% r! P# ~! }% p
{! Y2 _( Y! v, ]
b1[jj] = vec1[jj];* B- ?+ I- K5 z3 v1 k* q
}
# ^, N l* T/ F7 U0 S: p i' w0 N1 }8 a S( V$ @
for (size_t jj = 0; jj < vec2.size(); jj++)
* C5 r8 u$ I& Q {2 N' r% j e' C8 F1 L6 a( c2 Q, a
b2[jj] = vec2[jj];
8 E$ x1 f: Z' B, {. B# {! H }$ X9 g) }$ J7 ^ E C
1 B1 M/ P$ M- p$ Y9 l
//Method - 1 N=100000 247s # G$ T, R$ P7 z5 J0 r5 t, ^
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
7 W+ [1 J) j7 Y
: S" H- t, \/ s7 d# n2 x6 m2 o! C //Method - 2 N=100000 237s6 ?5 D5 _. w" [: C* o7 e7 N
/*" G. `0 C3 t2 P5 s, f& i+ E
for (int jj = 0; jj < N ; jj++); a+ q o; A5 y
{
; D- I2 G1 `% z. G. G) Q" Q& D fresult += vec1[jj] * vec2[jj];% F: ^) K, W$ q. \
}/ Z+ v2 _6 F+ {; l1 j# @* m5 Q# c
*/
8 m* Q2 r# [8 x; w0 D3 ^+ K
S6 D% b6 i1 v. V* }0 { //Method - 3 N=100000 204s
3 Y* J: m( _& M7 M; j. W /*
) e2 W' N- _, v. l" x5 q0 u for (int jj = 0; jj < N; jj++)# L& @9 x* n3 @- F1 _
{( u/ ]+ [0 W. M' l2 F. p; u1 {+ s
fresult += b1[jj] * b2[jj];
6 k% Z' C/ m' e( v' s/ s( m }+ c3 m; {& h& Z! s( U4 S
*/9 u) z" l( z; o- S' l0 r- j5 S
' Y' h) ?, L- j2 @3 C9 s //Method - 4 202s
# ^4 R# u. l4 ?" b( D0 } /*
$ i7 {. |6 O! k6 p for (int jj = 0; jj < N; jj++)3 {: _: b- }& v7 Q7 {! p1 ^
{ _3 k0 a/ n9 R8 a2 r, F; L: l0 [
+ g( C0 r: N" E" q& v& z5 c- N1 K }5 K: s% O2 e) ?2 }. W6 p' s
*/
* }# D7 v+ v4 p3 v- W //comment out all methods, N=100000 202s
6 h! j+ O0 x5 J8 f0 n }) O' \& N, e7 F+ h! l8 K$ k4 @* X
8 b( T' ]7 }# X
delete []b1;* V$ d: n# _' C: _
delete []b2;
) G8 g4 G+ \$ t3 N8 P1 M |
|