TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
# k% h1 i6 M# z7 S- d: G6 N! _
7 z9 Q# D7 r0 }* |% c理了理思路,重新做了一个测试。6 @- |6 U1 [: ^, Q' i+ U& w
做了两个 vector 和 两个 float *, 都长 100000* }* V% `* N" {5 z
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
5 e$ B- t1 u; F* y9 h: o! n: e/ @" [: B$ l. J2 ~
内循环试了4种方法,
h8 ]3 ^- K" R7 i1. 直接调用 vector inner_product 247s " Y) @% E G/ o0 x9 P3 x) x
2. vector 循环点乘累加 237s c% R' c I, I) P/ l. F
3. float * 循环点乘累加 204s5 _+ O7 u" t7 _# E$ h: k
4. 空循环 100000 次 202s
; C6 W$ i/ y6 D9 y, R; F' w3 ~8 E
, }. `5 e+ J5 [- [ a% q" T不做内循环 200s
, y* J+ \+ Y! s w" I
( M& W) m0 X7 c5 D你昨天说的对,内循环本身占比是很小的,大头在其他处理。8 R- N5 ]. J4 T! X7 s
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
5 y% f' o' p, ~0 w% A
/ q4 m; Z* {' a! i' k8 G, x至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
- Q- \; |: |- U4 [/ I- w* e9 a
$ V2 G0 Q' m& _& F0 q(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)0 _& z" k k: T7 c7 T
1 Z! Z3 d2 {, z4 u ~ std::vector < float > vec1(N);2 L4 e) y/ B; f( s. Z7 ?$ D
std::vector < float > vec2(N);4 d9 r$ ^$ ]% r9 S7 s
float* b1 = new float[N];: P% A4 y, G1 c
float* b2 = new float[N];
+ P8 g5 X& q2 S$ ]
- Z. F6 D! G: g1 u7 Q) w for (int j = 0; j < 6000; j++)/ e. p* W, l/ H/ X% F- K
{
% K: {- V1 o" S std::generate(vec1.begin(), vec1.end(), []() {$ ]# W3 O' Z9 w/ V* {1 _: I, Q
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;) B, W# _, Y' u
});
$ c2 G5 A! ~1 V, {7 Z( }2 Y+ {8 E1 U9 N$ W1 h( R
std::generate(vec2.begin(), vec2.end(), []() {+ X( }+ C1 W8 Z! j/ Y' _
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
( @# C3 t8 |1 D });
5 [ x4 Y( v; |$ C
0 \ h9 D: \6 s9 M for (size_t jj = 0; jj < vec1.size(); jj++)
; U# K" u' }( G# [ {$ v v( F. E: k7 k" I: G
b1[jj] = vec1[jj];, v' @, ^8 ~( N m+ x
}* d+ r1 v* ^9 |! j( ]5 ~- G( x
9 W, B- s. |" O2 q6 U7 M- o3 l for (size_t jj = 0; jj < vec2.size(); jj++)
- s3 ~1 ^( x0 L4 O- I1 [- i {9 p% x2 }+ y. n7 s
b2[jj] = vec2[jj];( ^ c( o! B6 q) Y
}) u$ j' G% }4 i2 A: m/ a# |
' K; ~' z1 }) ^8 A. ^+ e
//Method - 1 N=100000 247s
7 i& y/ d/ u' v, p5 O. \ //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
0 `8 K7 p1 Q7 {7 L
: N% J' y$ v& C+ F' C3 S& P/ n1 g //Method - 2 N=100000 237s2 ~9 l0 f% c- e- o$ f; V
/*+ z. M5 a3 ]9 H5 s2 h
for (int jj = 0; jj < N ; jj++)
* h! x& i0 Y4 z6 p, O8 U' S {
5 h. r" | O) D- J8 s1 _3 w7 d5 I: A fresult += vec1[jj] * vec2[jj];! i, s5 e, A# z4 ?/ S
}2 e) h v$ E+ u+ g; p% q
*/$ c' r4 v! r. n8 o2 M9 ~
3 k- H2 s: m: V& |! J
//Method - 3 N=100000 204s
2 Q/ g% ]! G( W2 i( n' } /*
. n4 [' o8 w5 ?4 ^ for (int jj = 0; jj < N; jj++)# x) S6 r- ~3 T- [! }
{
1 j- v4 t9 e! ?. e8 u* L fresult += b1[jj] * b2[jj];5 Y ~4 a- | \, N
}
8 W/ }; ]9 r1 V3 a8 d3 R */
4 K B7 m; A: J
: P( ^9 L2 r) {8 B2 M //Method - 4 202s
2 c2 ~: M9 }9 T! ^* u$ `' s /*' H4 u% i5 U) F1 g: r
for (int jj = 0; jj < N; jj++)
3 G4 Z( X9 }: Z4 i* S" K+ a* @8 \ {
% w) d3 H/ M0 @2 V 5 w2 o% B0 X2 E
}" B! _, O/ S0 I* d3 q) I P
*/, f. H B, o* P
//comment out all methods, N=100000 202s # [8 i5 v! U8 d C) @! ]; c; x
}/ Y2 z/ Q5 K2 _
' Z4 c' b/ ]3 S9 I+ A/ o- c delete []b1; h. Z! Q9 g+ X3 s. `! {
delete []b2; . U3 I* r4 s0 _& c! R1 U! h# Z8 y' |
|
|