TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 - A2 Q2 R* Q1 o/ P8 d! L" S7 J
( H& l! c l; Z/ J( \7 ^: _理了理思路,重新做了一个测试。4 G: L3 u- z6 w3 x/ p2 {2 ~
做了两个 vector 和 两个 float *, 都长 100000( |2 l, c9 S/ v2 l/ Y- S
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.7 a; e5 m3 V v: L9 ~
* |' D+ h( _$ J8 x8 L内循环试了4种方法,
, e3 _5 t- _; c m" z1. 直接调用 vector inner_product 247s
. |7 P' G9 Z$ S2. vector 循环点乘累加 237s
S5 D0 ]9 e' F9 Y% v8 ~3. float * 循环点乘累加 204s B; Q0 J3 N" T6 l/ G
4. 空循环 100000 次 202s
9 `& O; w, W& j1 L; s6 b
( U( g- w+ [* Z5 ]% A4 p不做内循环 200s, z& M2 W9 e& k" x5 h! j, @
E8 J/ w9 C% X2 O0 o& \) A你昨天说的对,内循环本身占比是很小的,大头在其他处理。
& D7 \5 a) U& ]另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
, s/ b& W! m& }: L% {, _( L% ]& @2 s, ?! q! N: L8 R; c
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
! Z( |# n% J! B- ?# d; u
( x+ l) w/ `" j, g) p2 _; h& E! G(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)/ g; E( o' W: i: a" g8 a
- W' \4 e3 Y& ]- x5 X
std::vector < float > vec1(N);
6 `' G. r0 s$ L6 A std::vector < float > vec2(N);
% g& M" B5 {) F' L float* b1 = new float[N];' u, u: L% e) ]1 I
float* b2 = new float[N];
$ w M6 b) D& ?5 G9 E5 B) w1 s7 r1 c- s* V7 M
for (int j = 0; j < 6000; j++)
8 w9 l! k9 h# q' E {8 t* v; m" i4 ?9 T
std::generate(vec1.begin(), vec1.end(), []() {
i3 c0 f3 G1 i return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
, p {8 [( _( U6 n5 r });5 X# Y& E- ^* ~3 _6 u' a
& \8 q, S4 H5 ]' _0 g6 ` std::generate(vec2.begin(), vec2.end(), []() {; }4 B% B' y9 ]4 s. I: m
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;1 s I5 T# G5 C+ d
});" @+ V& n& u7 Y3 R5 F3 u9 \
6 a5 N% J5 p! X0 L4 T3 P for (size_t jj = 0; jj < vec1.size(); jj++)3 t" |* A' H' e6 q6 N5 ^: e
{! F$ v4 @5 W( H& G& W. w5 K
b1[jj] = vec1[jj];+ K4 ~, Z- W5 ?# k
}+ D, F' I. t# R9 i# i
5 s6 y# r2 ]( ]; j7 \+ k& s
for (size_t jj = 0; jj < vec2.size(); jj++)
# _; Y5 \' l3 j R* ?2 r, s. A4 }1 w {
' y' _* j1 |6 F2 R; j, F. f b2[jj] = vec2[jj];7 N. k0 M! V. C, f& f
}6 S7 x5 X- T7 {- r1 ^) G( T
5 A4 X1 j) p$ } Q1 O. C //Method - 1 N=100000 247s
5 n m9 I" p6 d5 C# } //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
" i% N. ^# M+ u* Q! U% L" D ( U. _ \. z9 ~' l
//Method - 2 N=100000 237s
+ v+ u& W, c8 v! r# O% Z /*
4 K8 A4 m2 i9 [+ L& V' B for (int jj = 0; jj < N ; jj++)5 W( W' W$ C: `& _5 K2 S
{
9 I' b9 g& o9 M* J0 U' u fresult += vec1[jj] * vec2[jj];
, x4 P9 U5 ^! U1 V9 k: }/ M }3 T9 Q) E9 y0 d4 S/ z, B
*/
% R; z1 w+ b: _& v; d. t, A , y0 A7 q) x: f# E+ }
//Method - 3 N=100000 204s' Q( L9 t/ k9 K
/*
" J: x$ s- S V! A. V6 f4 A for (int jj = 0; jj < N; jj++)
& N- ?7 d, ^6 P9 f* L; |- u {4 a* m6 h! n/ V/ o
fresult += b1[jj] * b2[jj];2 Q ~. C) v$ A$ _/ V7 C
}
+ `- w* b! `$ l6 A */
# W* \0 N5 }* Y
. z2 H+ V. r$ M( \ //Method - 4 202s0 h8 D9 h9 @! a
/*
3 N& h+ V& ^( n6 f5 ^ for (int jj = 0; jj < N; jj++)( K i0 Z: b1 L3 _7 J
{
3 T; ]2 U& |9 y& Q0 a' m3 _
( v. P+ Q! S9 M+ V# o" `( H }
. h! D) j3 M- q8 P: ^) x */1 }" D; y! v8 A5 J9 o
//comment out all methods, N=100000 202s
8 \ |/ K: K- G }
( V* B; O: Z. \# b, c) P6 e! c6 n3 ^. @4 X( ~# p1 v
delete []b1;- q7 Q! i7 v+ E! M* }+ ]
delete []b2;
) w( D7 R) j9 e f, S |
|