TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
0 N: T6 p: x9 Z2 e5 ^
: u" a7 R& ?! C$ t# l6 q理了理思路,重新做了一个测试。) y' x5 F* Y% L3 g
做了两个 vector 和 两个 float *, 都长 100000
$ K' f$ X0 ^ q外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.9 x$ M4 {& M- K s6 l- d$ A" m7 ~" c
* ?' L1 B, k3 n2 G( i$ o; l; \4 f内循环试了4种方法,
9 c, t1 L8 {; d. c1 z1. 直接调用 vector inner_product 247s
& [* U% L& `8 l6 J) m3 h2. vector 循环点乘累加 237s
# s! {9 ~% g d* c+ j3. float * 循环点乘累加 204s, {3 s9 K4 L1 T% g) p/ a- x0 v
4. 空循环 100000 次 202s
# x- O$ w% t8 e7 F" D& X; d7 ~$ z1 T
( w5 \" c! n d4 D5 c- W' C: H不做内循环 200s
{( _( Y: `# }) @% y
f+ |- ]: r$ p2 @* z; a你昨天说的对,内循环本身占比是很小的,大头在其他处理。4 O* ^% B6 Q5 p9 U3 W- o0 ^
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
& p' k* m/ Q6 m3 Z: K, e/ d8 x, Q7 w m
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试), `: K( W! z: U9 d8 |' M- T
3 l) @7 W1 Y6 U( n8 g(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)2 M; Z h$ j3 _- v
+ z/ e( n' n r0 _ std::vector < float > vec1(N);$ s5 @7 ~: _+ B% q' i$ y/ K1 _; H& e, a
std::vector < float > vec2(N);
3 Z" b. o- b. |8 ` float* b1 = new float[N];: }. F( r, ?$ q4 e9 s. L5 Z
float* b2 = new float[N];
) @% s. a. A6 m8 M1 u- i8 u2 q$ O7 N! _1 d( F% e
for (int j = 0; j < 6000; j++)5 U7 W Y v* @5 d/ [$ q
{. b5 }* T7 S& v$ T' l4 {2 ?, L
std::generate(vec1.begin(), vec1.end(), []() {; r& | E" H6 `5 Y7 F
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
2 @ t+ W% I* e; b; h d7 ?$ H, y });" R* F- C$ x1 t( P
- f$ Q8 Y$ v; N: u
std::generate(vec2.begin(), vec2.end(), []() {
. H7 Q1 Q: s2 H9 i7 |8 } return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
9 y D6 q5 F4 p8 n });
% ]: L9 D# a- h! u8 d- R6 u) \3 k/ q- v# B
for (size_t jj = 0; jj < vec1.size(); jj++)
: n- p7 S, M* x8 p {
' `3 T' B1 @5 P3 W( A b1[jj] = vec1[jj];
! p0 P- q! z1 ~; S% B1 D6 p/ e( Q }
7 L' F; h$ u K! @& s# B4 |
2 X! G- X. B- d% n( b. o$ a l for (size_t jj = 0; jj < vec2.size(); jj++)
- y* g4 d# V2 O; V; ~9 H( v$ ? {
4 T5 o! Y( C. b0 g4 i1 d b2[jj] = vec2[jj];
5 V/ x& x& h- ^ Z/ g }
+ f3 [3 s' U2 G i/ Y% m
0 t. X8 n$ _0 m4 ?* P //Method - 1 N=100000 247s 4 K( P( i0 f* Z; K8 W# T
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
+ m1 u/ c k @, |2 X7 O$ X
, N7 x2 p. k6 z% U, | //Method - 2 N=100000 237s- ~, c7 G' s( n
/** r! r+ V$ [8 W# | h5 U8 l
for (int jj = 0; jj < N ; jj++)7 {% i' e6 C$ N6 [
{
0 X8 I' t9 [' B5 N' m& D3 r fresult += vec1[jj] * vec2[jj];8 ]9 a4 I% m- E4 E
}
5 q6 }1 F6 q0 Q6 |5 P */2 K8 w* |4 I! | W8 T
7 V- a* ]% Z3 c! }- J6 l% u
//Method - 3 N=100000 204s
4 d% m* j+ |! E /*" T, H6 Y! f& z" D Q6 W
for (int jj = 0; jj < N; jj++)
) |* u6 s9 C8 D- P {0 K) y( V* {) ?2 H' v
fresult += b1[jj] * b2[jj];
$ _7 T) ?$ a$ X( x4 } }% T, S# X4 B! Z" z+ m r- z) u1 k
*/
% |8 s6 i7 r( ]4 c* D2 @& T5 e
8 Z; I- a! ^# F$ D, S //Method - 4 202s9 y( m" {7 S1 G3 `+ o( ~2 ]; S
/*
& f2 Y& [- X; b, {7 h! C for (int jj = 0; jj < N; jj++)
* k* B8 ?. Q* L5 ?; _ {
6 f! [6 R# l5 l1 f+ J5 a7 M% e0 m7 k : j' R9 C9 C# B
}: V& @) w/ |3 o3 p6 _( T. S
*/
4 @6 s1 r, q2 t6 m' u- D" P, w //comment out all methods, N=100000 202s
, ^/ I7 T" W" z }
) `+ |8 l6 A( x5 R' E" d* T/ w' L/ e$ u0 e- m" i
delete []b1;
# e- |7 C8 Q9 g, P; N! U3 p delete []b2;
) H9 Q0 M- b# |9 c }# Z |
|