TA的每日心情 | 奋斗 4 天前 |
|---|
签到天数: 1184 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 , j0 Y: T- ^6 t# E0 n+ Z2 h
6 k3 n2 J J' C- i: r
理了理思路,重新做了一个测试。
' G1 A* s8 s8 g Q做了两个 vector 和 两个 float *, 都长 100000/ p1 F0 Z* x. r
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.' w" z. i7 W$ p0 o4 T, Z
; D% I5 `+ N2 m j8 K* ]: }
内循环试了4种方法,! x$ [8 |7 w1 t, x& G8 B
1. 直接调用 vector inner_product 247s
0 }3 T$ `3 l) C% K1 E4 H5 Z2. vector 循环点乘累加 237s; m/ Z" m+ L1 E- g0 S! s( j' f u8 J
3. float * 循环点乘累加 204s8 g. V) w, {: c' a: i* i% `1 v
4. 空循环 100000 次 202s* X7 {! f9 l4 e% _: F. [
( S8 M }" z1 \/ L( v n
不做内循环 200s: D) D6 d0 A& h) \' M1 y. {, r
" O& f) U$ Y0 h) y U你昨天说的对,内循环本身占比是很小的,大头在其他处理。
6 v O$ q, V- t; F另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。6 J9 k( p) O, Y, o
7 ~ |9 I* h2 V& j; Z" Q至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
: e3 ~) G( I8 ?" F; J" {
# ]; U* A9 X N3 e! o(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)7 ~" d& k$ g) x/ v
/ [5 ]$ B# b( f% O
std::vector < float > vec1(N); t9 _3 y" z7 ~ z; M1 T
std::vector < float > vec2(N);( z7 ^& Q& Y# k
float* b1 = new float[N];
7 m/ k Z1 [2 K2 r+ A8 d% X float* b2 = new float[N];7 Z: w Q1 b! b$ o1 {( v( Q
% @. R5 {0 F7 G8 u! Y& a9 i
for (int j = 0; j < 6000; j++)% Z. R( ]! M( U8 [
{$ I" n. x- W5 v) o+ z% X
std::generate(vec1.begin(), vec1.end(), []() {1 @4 c2 U2 ?4 s* f" c# @
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
# k8 [$ D6 x2 j! u0 c. c6 D });
* n C( X4 i! w; f9 [& e! t7 K! Z: F- E- I' l$ g* s9 g9 ?
std::generate(vec2.begin(), vec2.end(), []() {: u" `" M! v0 o4 b; } O% G$ \
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
( d5 g7 K8 z2 L- M% F });) a7 x; y4 M' q" Z1 m
+ L+ a; f: W. I+ K) m3 t# e" f for (size_t jj = 0; jj < vec1.size(); jj++)1 T2 E" v7 P! P; K4 H2 H' _
{% I: V' ?) [9 T1 p
b1[jj] = vec1[jj];
7 ]* I/ ?4 H4 h) N }$ l% s: l! w3 R
, {& E$ P: y5 D, V; U for (size_t jj = 0; jj < vec2.size(); jj++)( A6 K3 i( ~# D+ C
{) k |8 d7 u. o% S
b2[jj] = vec2[jj];5 p- ~# Q' K- _6 p5 P
}
0 L, _8 V) i' }; p# s/ J0 H' i2 ~) g; O5 W& I- E
//Method - 1 N=100000 247s % p2 m& D: r) M5 b# l) B
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
* K0 z3 a3 m o$ W, i2 N
, l/ i, s' L; S; j" ^' k- Y //Method - 2 N=100000 237s8 `& [/ X7 }" S! e4 r
/*
6 K c3 V* S6 T3 o( m! V for (int jj = 0; jj < N ; jj++)& A" u2 d: j/ [3 o1 m& U
{) J' ~: I' t) q/ @
fresult += vec1[jj] * vec2[jj];# Z! m) a9 K( t
}! A5 }( a* r9 x
*/
' G5 p0 o( c! K M$ \1 Q 2 `0 q- x) T8 L, k$ J L
//Method - 3 N=100000 204s' O7 d( C' ]0 k/ L: i4 Q! q
/*) W- ?- [* s2 s9 Y$ g* v
for (int jj = 0; jj < N; jj++)
+ J5 G4 [+ n6 ~/ i" ? {
% C' y) k* y& L( f" q fresult += b1[jj] * b2[jj];+ t% X( }$ U" m3 `1 ~. T
}
' U- |% w9 l4 [! |# K* q, P C */
z* ^9 v0 T; w9 X6 |* E! G6 G
; C- E. T" `, f1 ] //Method - 4 202s( F( ?& t8 Q- v/ d e3 d7 x
/*
6 U/ x+ V* R% g' a, r% O for (int jj = 0; jj < N; jj++)2 G0 }. R& [* l3 \+ z. Y; }
{3 T3 N# u' D, V2 z x y" c: Q
- p. ]/ i' U( d) C8 I+ Z
}' |/ u+ A" x% j; K
*/0 E& G7 m0 b0 Q0 I
//comment out all methods, N=100000 202s : u- {9 v& K/ d6 D; |. Q' L
}% d* ?3 E( L7 U7 r5 K
2 y) K- m4 `9 I
delete []b1;
- i+ I* |- ?0 w, P3 C0 Z delete []b2; W; y9 D' f2 S' e( x, P* x( N
|
|