TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
9 C9 T5 ?& t2 U4 V2 x7 h
/ ]& p( U# a& x# @1 i: ]/ Q6 p( G理了理思路,重新做了一个测试。$ ~/ @3 T( r+ x# f
做了两个 vector 和 两个 float *, 都长 100000) g% R( _( D6 [4 R- w2 P/ Q0 H4 V# a
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.4 }: ~1 ~9 S8 ?7 B, R, y; W$ x5 T
5 W. ?0 u0 G8 f [) x0 t
内循环试了4种方法,8 _& I; \0 S' w4 S, X9 [* `$ z
1. 直接调用 vector inner_product 247s
* H0 w! Z. d4 A: q' P4 F# ?2. vector 循环点乘累加 237s' @" Q4 O5 k. o U e4 Y' d
3. float * 循环点乘累加 204s
% u6 k7 K; u J4. 空循环 100000 次 202s
+ v5 b! L9 Y: w0 M9 p' i1 l6 {6 g3 z5 u
不做内循环 200s' S0 s) i: i: H1 O+ p
! M" `# s: O0 @8 K你昨天说的对,内循环本身占比是很小的,大头在其他处理。
/ D1 \6 e6 s0 a: X4 M9 [另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
( W! M) G) m! _
0 [& H) ~5 L, K+ }至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)% T: K4 f" a( z
4 @, F: ?; R! E s% B' U+ r
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
( C- j3 F1 L4 `3 ?" Q4 p" l- @' E& C( W9 |! [) n1 p) {! p* y g
std::vector < float > vec1(N);* b N* X% d3 a/ r
std::vector < float > vec2(N);' W( K* ]0 b: a3 `. A0 `3 w
float* b1 = new float[N];
! D6 ^4 V3 k9 f float* b2 = new float[N];; N" v4 p& X3 R% T8 D
4 c+ a6 h9 p& D. h) h, D
for (int j = 0; j < 6000; j++)1 s! n0 f( y* r) s: h( l$ Z
{
- V4 i* p- S A. ^* a7 {9 j1 | std::generate(vec1.begin(), vec1.end(), []() {
* R4 p" |+ f7 A* [3 ]3 w& V return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
! p0 Z! S( ^: F2 A. ~" i! a5 V });4 V; Z7 D( K$ i$ y
Q8 \ W( L1 h' [5 M- Y& m
std::generate(vec2.begin(), vec2.end(), []() {
4 ^; c" x# |! C! z, c% Y return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;8 |4 I, C6 U+ h* c1 M
});
" M7 t& @! w; `5 s2 G8 t/ N$ ^1 \7 Z o s7 Q8 U5 ?- _) G
for (size_t jj = 0; jj < vec1.size(); jj++)
/ s# G) {9 z& ^9 R2 S w O {- ~- a. v# y/ ?- p
b1[jj] = vec1[jj];
" ]# k- @: Z7 T6 M }, v6 a, ^; d& `& O# S( S
6 o' r% A0 d n6 d
for (size_t jj = 0; jj < vec2.size(); jj++)
; o; S+ x8 P9 f$ R; w {
S& H+ i( `0 f+ c b2[jj] = vec2[jj];
, `8 z5 A0 M4 \. a }
, w @$ X. s9 L. ]( o q5 J* j. |6 X$ f
//Method - 1 N=100000 247s
\# S3 L. W7 m3 r* o //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);1 v0 H/ ~5 U$ E: f8 A/ s' |, e
; }1 ]- i* k i: P5 `# }0 s //Method - 2 N=100000 237s3 G" n4 m2 F7 y6 a0 T
/*
2 @- [5 Q. f% W% f4 [0 ^ for (int jj = 0; jj < N ; jj++); ~' m) @% ~$ n* I
{$ s& L0 q k# Z1 ` }" g8 T
fresult += vec1[jj] * vec2[jj];
8 Q5 T7 d* _/ i) [- \ }
. F* o( ^1 d# Y. N) g4 w& k- P1 E$ y */. j$ u. ^$ c7 G+ p" r+ ]
3 J7 m- I& G( B" P9 W
//Method - 3 N=100000 204s
- f* U: g; v9 x1 K2 m /*2 r' G) a( \! ~
for (int jj = 0; jj < N; jj++)
, Y+ E9 d `+ r {
2 }! R( o/ o8 S+ ~ fresult += b1[jj] * b2[jj];) h& q }( M/ R7 _7 {
}
- s6 b, {# ], Q* c7 ~" Y @ */) a" a. l+ P, X9 ^6 Y
5 S& W8 n% Z1 E
//Method - 4 202s2 f( V+ ~& H! E* O# K
/*
; E% W% i& j" {) S8 p( T for (int jj = 0; jj < N; jj++)4 D* J3 f- b# u" B; q$ F! r" D
{
$ j- i/ g) V! t+ N 5 U8 |, h; q) C3 S5 U1 `, B' F( P
}" G% F: C4 u* t
*/
: e) m. i5 g0 K! k# N( e, Y //comment out all methods, N=100000 202s 3 @" ?4 b0 L; L/ r% t$ ~
}
2 G% k- R3 M& V- U7 g1 N( [" d. ]# k5 R$ t, P( ?
delete []b1;
4 `2 Z2 Q4 T5 T ` delete []b2; 9 C9 k' [' V, }8 J9 Y
|
|