TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 . u7 V. Z+ Y& ?0 O3 S7 E1 k; a
; ]$ K5 E1 {. M* z# @1 V; J
理了理思路,重新做了一个测试。1 _; I e5 i9 R: k0 I9 q2 \& U5 e
做了两个 vector 和 两个 float *, 都长 100000
9 a) X, a# J/ T3 Y外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.. k7 X# @$ b) ]4 F" d
% M R# z% S, b6 M8 H9 P5 Y7 ?7 Y
内循环试了4种方法,
1 E" M& D6 R# g; `" s1. 直接调用 vector inner_product 247s
$ j* {- u) Z" {0 x2. vector 循环点乘累加 237s0 q& o1 l& @0 l5 g0 j, {: [8 E
3. float * 循环点乘累加 204s
2 f3 T7 N8 O# |& J- H+ N4. 空循环 100000 次 202s) P% \: P! Z" {- w! q$ j' N
# p- @, j) L* W; Z
不做内循环 200s
t5 r, G4 w5 k* ~# G( t, D, }+ n
你昨天说的对,内循环本身占比是很小的,大头在其他处理。3 D8 c+ A' a4 b$ q! g, t- v
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
/ G* c1 A. n% |( ^! r& E5 i
- ?8 \+ D3 G; e2 w+ v6 w6 V. ] [+ k至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
0 {& i9 w0 z3 r& ?/ q9 d7 l7 P5 l5 J
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
* x: l6 j* d5 P. {+ i
4 G! R' n' O7 T- ~) \, R8 B std::vector < float > vec1(N);0 Z8 [8 k# d7 g; X7 ?" K
std::vector < float > vec2(N);, V( o" {5 b0 |' |
float* b1 = new float[N];
; X E+ x2 L0 W float* b2 = new float[N];
* w/ u7 s8 O# j9 g
- x: A; }: W9 X for (int j = 0; j < 6000; j++)! ^, }: J2 u2 q" s
{
- S5 D! o' I- y/ t9 `: a std::generate(vec1.begin(), vec1.end(), []() {
5 _! t5 ?/ R! v9 S return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
3 r. M2 f+ x4 a1 v* J) e });( @, ]0 O+ ?9 O& D
$ H: z0 v1 F* P% l/ c( Y9 e1 G, ` std::generate(vec2.begin(), vec2.end(), []() {
+ K, M. H5 v/ Q$ { ?! j return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;: f/ \( T1 p4 I% _/ ~6 d8 Y
});, p2 p+ [9 t+ F. M2 n+ G$ @
: c/ w# h" l; B% i4 @% |
for (size_t jj = 0; jj < vec1.size(); jj++)
% a: P4 F) u! V" b2 ^+ G" y {% ~" K) n- ^7 ^, O- K6 l6 f
b1[jj] = vec1[jj];3 A$ _7 v! w8 ]# ]4 E7 o+ _
}
% `4 C, \+ M5 Y5 z( I) ^% s Y& ~. z
for (size_t jj = 0; jj < vec2.size(); jj++)
$ l9 H% F" a) t) |" g2 g/ G {
1 i# c8 Z2 k4 G* p b2[jj] = vec2[jj];
+ [# N# D5 ]& H2 Z. N8 O' ?" y# ?3 I& a }
/ m1 J6 H; a0 ?! j0 \* T0 J& h3 v2 s( i. r M! J
//Method - 1 N=100000 247s - r3 W5 w: h; L; j( s3 j
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);; [; P, _: y( E
Q6 [. |. H+ Z+ H6 I2 y+ D //Method - 2 N=100000 237s
7 Y9 y9 }6 l6 V; j1 x: k /*
# k Z" [) o4 m0 P( z8 J5 z( a for (int jj = 0; jj < N ; jj++)
9 A8 J4 J# A! `6 z1 m {5 A3 s" R2 A3 |. B% j/ |% {) a) Y
fresult += vec1[jj] * vec2[jj]; ]1 H5 K7 ^/ u/ x2 G: n
}
: H; ]8 @; [- T3 L' c4 S3 J */. w9 f) B2 @+ [/ f9 l
1 ]0 x- |, w8 ?8 Z( V //Method - 3 N=100000 204s4 B" M- m, n9 b. x8 W* e
/*# F+ P7 e$ |5 E( Z
for (int jj = 0; jj < N; jj++); L0 h, h! Q& c
{; v# I4 t9 @3 l! M
fresult += b1[jj] * b2[jj];' S |2 A4 W0 Q% x% d' [
}% I6 i5 \4 Z- n6 \$ @# `! z. `4 [
*/( K2 A- A& x. [" Y1 [3 s0 x+ R" r) Z4 K
6 R, F% k+ D( x8 u! b
//Method - 4 202s' r# D; M+ J& z. q( n
/*- x/ W9 N7 K! a0 M1 V
for (int jj = 0; jj < N; jj++)% I6 Q$ B9 H" n! @, G$ d
{) G8 Z, E( g) \
# C$ o9 @* I B5 q/ L }
$ f. F3 ^% a0 Q; S */" O4 [/ u [+ r# G; U
//comment out all methods, N=100000 202s
' b- Z+ `8 w) T* R7 `/ B3 M/ m! L8 X+ T }2 J( R U9 m/ n
; [6 _- C. h3 F
delete []b1;
5 Q$ T+ i% d4 F( ^ delete []b2;
0 q0 K+ P0 h& ^: z M- L& c' C" {! L |
|