TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
4 r- u5 ]4 A: L# m! A5 E* N* o# k- G. y% S: y6 y
理了理思路,重新做了一个测试。
" u3 Y% m7 }9 ]9 K% n: v0 W做了两个 vector 和 两个 float *, 都长 1000008 y6 L. V/ k6 j5 N" q
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.' F8 X, |) t5 T2 j2 }
0 T. o5 n! T6 z内循环试了4种方法,% X" Z$ J) t5 v& U+ } w; T. A. X
1. 直接调用 vector inner_product 247s 7 ]" \' T2 X2 e
2. vector 循环点乘累加 237s. M! i, w: {9 Y% q Z1 [& y
3. float * 循环点乘累加 204s+ n4 j# q+ t+ b; g- h" S( |
4. 空循环 100000 次 202s
; G7 S( v) _7 k* F5 t% ~
$ Q- W/ X; [, C9 H& w不做内循环 200s
. L7 z% A4 G5 R& s0 T4 s
+ Y I9 @2 v& D! _1 k% J你昨天说的对,内循环本身占比是很小的,大头在其他处理。 a0 [( O9 I3 j6 q- `0 ]" T1 ~
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
) s* W7 I! i) T& E- W% H9 F
! m- t7 i# t. e G' ?至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
( k9 o6 s1 f! p5 O8 r: R# r' x$ ~7 Q8 H, h1 N6 d
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)! L! y* S" \3 K2 I' S8 @* P7 i" g
) T& A; V: X3 y. I# S: e# `0 t std::vector < float > vec1(N);; ^6 o! g8 `) e! l# z
std::vector < float > vec2(N);- b. j o6 @9 [' o: Y6 b6 C
float* b1 = new float[N];
) u# h' }3 F( g) D3 k/ U+ Q- Q6 a float* b2 = new float[N];7 m1 J3 r9 c0 `
& N7 Y: W" X$ c9 t* B& h! f for (int j = 0; j < 6000; j++). k$ ~# ^) i. n3 \3 x2 I
{* d& c- I: F. ~% l7 F% h
std::generate(vec1.begin(), vec1.end(), []() {
; x0 V/ _8 @ D8 j1 W return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
. l8 w3 N5 b) t |0 l% R; B$ {) U });! r: N6 q+ K8 T1 r$ q
2 G/ S1 t. ~$ E4 } @1 M- o
std::generate(vec2.begin(), vec2.end(), []() {+ @. X1 U8 W, ~; G9 y
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;8 K: n; x# D0 D" K! L
});
: @5 ], a" V9 S6 v
% ~$ Y1 t: H( D" S for (size_t jj = 0; jj < vec1.size(); jj++)$ t* _- m L/ K j' T
{
- A- }* T7 h3 O, O A- H' g b1[jj] = vec1[jj];/ |+ c$ I2 t+ Y2 u1 z, q7 _
}
! Y5 E- {5 g8 J( n
3 ~. k" I3 L7 n% J1 N6 c for (size_t jj = 0; jj < vec2.size(); jj++). o q! m3 m, R( }
{
2 v! w/ f% X" a b2[jj] = vec2[jj];9 r" e/ W, @$ ]/ D
}. s, Y, I# K9 I& {3 K
& a: W. R/ Z) j! Z4 Q N$ G( t. v! u2 C //Method - 1 N=100000 247s
6 _. }% c1 L3 u' I; H' ]6 g //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);" `8 a1 a; s8 [' H) A$ e, G
( }0 @3 ]; e. c0 u |6 J% t, x //Method - 2 N=100000 237s
% P6 C. l8 ?9 C# |' ~ /*
+ O6 J+ @3 i7 j1 Q/ f4 ?5 f4 j for (int jj = 0; jj < N ; jj++)
9 l/ n% Z8 u m/ ?5 ~* v4 @, D# C' W {% c- e* A+ D9 Q3 o- R% q
fresult += vec1[jj] * vec2[jj];
9 V4 M: Y8 c; e! j& N& A- n }! G% B" F6 X8 n, q9 |
*/& s3 E1 A \' V/ o( o7 u! Z
6 I9 q1 J I# l7 L0 e* C //Method - 3 N=100000 204s" X4 h0 N8 [7 @; d# [
/*
$ n- l# k( r$ e z for (int jj = 0; jj < N; jj++)# a# M6 E, @9 E ^- q) [; P
{
~; R5 Y0 Q, \ fresult += b1[jj] * b2[jj];/ y- }! u9 X: y6 V
}5 X g2 u/ C4 ]7 g
*/ ~1 D& d6 i, z8 {3 x$ T
& v5 ~+ Z- B4 Q //Method - 4 202s+ B& G/ A% e# ?) U# O
/*
6 E, e* l! n0 u; X. }, R: ~# g3 v for (int jj = 0; jj < N; jj++)$ y( d! }1 w% Z3 G6 r6 }
{0 G* h B+ T1 ~9 P, Q0 R g' Y
2 M! n; J: Y# N* j8 r1 I8 W2 B: p
}
2 ?' b1 [$ [/ t0 d9 e2 H2 k */
9 Z! _! E8 b. p! s' u$ | //comment out all methods, N=100000 202s
( o# ~0 m9 u% W ^2 p }
J5 x! m: U0 b0 |- Z, S
9 @$ d+ G, ?' v1 Z delete []b1;
- q1 e5 k8 y6 S I2 \5 V delete []b2; 1 `) ]! n3 [- t1 D/ t* q1 j
|
|