TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
) U9 b- m* p3 E0 E. r3 J6 H+ w5 q
; [( G; ~0 N$ `' _理了理思路,重新做了一个测试。
! B; ]6 {: M# `$ p3 {. h做了两个 vector 和 两个 float *, 都长 100000% w3 _$ {* i5 N D1 f
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
- _- K: q0 o* g. S0 B/ _5 p9 o7 X) ~9 K1 N; j
内循环试了4种方法,
7 N+ g- p6 J& T$ m1. 直接调用 vector inner_product 247s
& A2 S; Z1 i( H. r2 g; l b! G# r' Y2. vector 循环点乘累加 237s
) }. Y5 C! e/ Y) F1 O! a' n/ k5 P3. float * 循环点乘累加 204s0 w; K* W, G2 K. o& H5 o
4. 空循环 100000 次 202s
7 N, o1 N4 @# \! L" h7 t* S0 [( x( n' P5 s6 C2 H
不做内循环 200s1 ~0 q5 u2 y$ J! j1 V
& w" @7 K- B( @9 U
你昨天说的对,内循环本身占比是很小的,大头在其他处理。4 G: I* ]) d, T$ T$ Q- n1 t
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。$ x- f4 ?6 H2 ^, p1 Q K+ E
; u& E" i% M f1 t至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
9 X- ~! U8 T& c S( v: k
; N. a; q$ a% H(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)( G, Z1 J8 e! S B* I
0 r' k' ~) c0 P& _
std::vector < float > vec1(N);
% Q9 W; e `1 k7 P( { std::vector < float > vec2(N);( n: D- |, x; Q, j, ~
float* b1 = new float[N];# Y- i) Y5 C5 N8 Z! _" |6 a
float* b2 = new float[N];) I' t* e, W1 ^5 v6 k1 ]
3 m7 N8 h$ {+ W# \ for (int j = 0; j < 6000; j++)' F1 T/ } g0 u3 I
{: g$ k- e( a0 H2 J# M6 Q P
std::generate(vec1.begin(), vec1.end(), []() {
% T' }) v: @$ S" f& d return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
/ |' H5 x5 |) C3 F });
( R' G7 C2 b; |+ y/ X6 M0 [7 t0 K6 ^( d/ H8 j& w M' \, j
std::generate(vec2.begin(), vec2.end(), []() {& d9 F0 o* n4 v: R+ T3 L0 @
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;) l; }" v* i9 q3 r1 |
});
9 Z) X% r- g5 k- q; j5 W2 ?) |% j. p" B& j" z6 ~
for (size_t jj = 0; jj < vec1.size(); jj++)$ |! u( z- d# w% v8 l' ?' f
{
5 F7 |+ m2 A! {5 @+ z; j) K b1[jj] = vec1[jj];, A1 }+ H' W5 m0 P
}) T4 L1 x! J x
9 U5 D: ^$ Y, o0 w* E k) ?
for (size_t jj = 0; jj < vec2.size(); jj++); o( R+ S3 k- W9 C5 v0 O3 l
{- D. B( L1 s; f1 w/ {9 O& N
b2[jj] = vec2[jj];7 b( E/ R% h2 x
}3 |8 a; P4 C) l9 d% L, _! Y! [; p
* r; ^* _$ D* T5 E2 u! p' b1 M //Method - 1 N=100000 247s
2 d4 H1 C+ d# n* u x2 b //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
8 O6 A7 R8 C- ~7 J
* I8 b. h, [ {* g/ k5 k //Method - 2 N=100000 237s
- w5 W" z% V* ], |" w) u /*# |/ R" C3 ^! K
for (int jj = 0; jj < N ; jj++)( z* ?1 w1 U* j! U# O2 f
{: e2 s; M- ~' V1 M) D
fresult += vec1[jj] * vec2[jj];0 o& ]' G+ ~, T6 v2 u
}" T. @! C" h! s; ]& ?: P& t
*/
% Y2 ?, _( F [
$ T. d# b$ D) Y# `( V //Method - 3 N=100000 204s
- i, E% F7 ^$ h& C2 \: Z8 Y3 M /*; S. M4 F# F0 @+ B; F5 { T
for (int jj = 0; jj < N; jj++)
7 |- \0 O( V/ U4 T {
! P& t% a+ X6 U$ q2 Y2 a fresult += b1[jj] * b2[jj];
: E3 j+ b- S* w: Y }
' i* M8 ^- \( f# V) x" E# O */* E/ a5 ]8 a* r- J# C0 `
2 a3 W0 r2 w3 y% J //Method - 4 202s6 q/ A5 H6 p5 m" [
/*
# y4 k- Y9 x1 V$ k for (int jj = 0; jj < N; jj++)
* A5 I4 I! y" a" ] {8 Y8 j8 ~7 W* G6 D, Z/ B% C4 [0 H
2 e; G- N: t8 O0 s. z* b0 {' Y8 W
}* A: @# [% P9 s' b
*/
0 W' q% C& |* t) W3 b/ y; a //comment out all methods, N=100000 202s 8 F7 G4 Y9 t; C$ Z3 V
}
2 W5 T- Y0 p; D3 N2 A3 f5 d6 l+ S' P+ y! \3 ~/ ?/ f; V0 E7 t
delete []b1;2 i7 n$ I! E7 U! f! L
delete []b2; 5 R$ q8 X% D# k0 y9 v6 F) z
|
|