TA的每日心情 | 擦汗 3 天前 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 $ z3 h) B2 {$ G C4 x" \! u
$ F' y$ P3 Z `2 c# {理了理思路,重新做了一个测试。+ T/ M3 c- k. r/ ~6 |. i6 h
做了两个 vector 和 两个 float *, 都长 100000
- k% i) o& `# S外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.8 I3 |( ~* p' ?* e5 ~: w2 p, w
6 w, a* ]/ d: D7 Q$ r7 f
内循环试了4种方法,9 r: X2 J3 |$ s. u
1. 直接调用 vector inner_product 247s
3 {/ c. ~$ |/ \9 p' u. R2. vector 循环点乘累加 237s
" @; @# U# D- H# F! \. m3. float * 循环点乘累加 204s4 }( Y3 ^; R, {
4. 空循环 100000 次 202s
. J3 K) s+ f7 N, c7 [9 s+ G, t2 M8 g5 q# l& p6 _, q
不做内循环 200s
8 g& R+ Z+ o4 E p m( F
5 w- \ `1 [1 f& ?& e) e" H你昨天说的对,内循环本身占比是很小的,大头在其他处理。 i2 W/ M3 b* n) T( t# t4 ^
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。: ?% w6 P6 t, E, v
Q) U W+ Z: n/ v/ L; j
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试) l5 M1 V8 }/ r+ k, B! ]
4 Y" Z) c j2 ]- i/ H* j8 K(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)9 A& D0 l3 y; h2 W) }
! O+ f j4 W9 b, G
std::vector < float > vec1(N);' o& R0 I) {7 K; W. m( [8 P
std::vector < float > vec2(N);+ Q* X8 z* y4 U( V5 D! m
float* b1 = new float[N];% B" f6 X0 y4 O$ b! l" P q
float* b2 = new float[N];
) k# x/ x9 i( b. A$ K
% j+ k- t: @1 B$ n1 S for (int j = 0; j < 6000; j++)/ x4 \7 P! O- Q2 e2 G9 c+ F3 G
{9 ^- E4 V* k [+ P0 ]" q$ ]
std::generate(vec1.begin(), vec1.end(), []() {
0 k. H" F" w% X1 C" M7 M/ F& I return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;! k3 D0 r8 u+ R. Q
});
: ^ Q7 h. t' P9 g7 f0 O
2 ~1 s! z1 D! \- x) t/ w std::generate(vec2.begin(), vec2.end(), []() {
9 k' P0 w! P7 }. B6 ?8 k# C, q return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
4 r i5 N$ O/ R });' p" n2 t8 K: |# I
) a4 c: \$ B8 g
for (size_t jj = 0; jj < vec1.size(); jj++)! ^7 |5 |) ]. G: B( w# _# h
{( P$ B/ R4 i- C( A5 R
b1[jj] = vec1[jj];
, ?0 Y, Y6 u4 u4 {% }5 h }1 N8 U) S; H* |6 d8 z
0 r6 t) r& d8 ~( ~ for (size_t jj = 0; jj < vec2.size(); jj++)$ s3 W4 \1 z* ?3 ^6 Z
{
" c( @% f1 m* G b2[jj] = vec2[jj];
/ V1 X. C, D: _ }
- ^5 i' a; f5 C$ D/ [5 Y# K J4 J: B* `# j" r2 J1 e; y8 V4 o
//Method - 1 N=100000 247s 0 N- D* p! l' P5 J% l
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
% F. L2 |+ a: z0 Q" @" ^
a$ o6 C! K6 H6 a R; b1 Q: ^ //Method - 2 N=100000 237s8 t! z0 q N' n
/*# D$ b2 R4 Y. _" c3 ?
for (int jj = 0; jj < N ; jj++)5 V. i* d. h; M- ^2 Z3 W
{" T8 m# ?2 T+ E' D9 x: O4 U, ^
fresult += vec1[jj] * vec2[jj];
& c7 [) _7 {# U" L1 ]/ G }
5 f. V% d% n7 ~# i */
: R/ Y6 \) o% ^3 W3 _ ( w I* T, K4 w1 X' T
//Method - 3 N=100000 204s, V) a/ y" [9 F# s2 \8 h
/*
4 D( {# P# u8 M# ], K, u8 J" I for (int jj = 0; jj < N; jj++)3 I" X7 F! B* m c+ W' p3 @
{4 ~; W! h" w, Z0 Z* J
fresult += b1[jj] * b2[jj];
( c$ Q4 J0 k, P$ w- D }
9 E0 `+ `/ L8 v" [ */
' B9 n ^; P6 V: ~
6 i: P h- `2 v* ^5 w6 a //Method - 4 202s
5 w2 q W) m# C: u7 Y k! w /*1 \6 Q; p7 b8 l2 w- n- w V7 c
for (int jj = 0; jj < N; jj++)
1 K" k' D7 P' d1 ]2 V. g' [9 U& J {
$ r8 o3 C1 L* K, E) q
$ w' |: \/ L% d/ k5 n8 ? }
* `! D9 j# L; k# A */
( C: Q/ |/ {" g1 k& {3 { //comment out all methods, N=100000 202s
h+ S7 j) s$ e. z. a, p7 ~ }, U6 d* h* `) K
/ H4 P. s0 J7 C' q1 q9 u3 b* R# N5 S3 F% a
delete []b1;
' L5 |3 _8 n1 ? delete []b2;
/ B& N0 A; m" `( u# g: w |
|