TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
c4 E( ^9 U5 }" l [2 \; l4 B+ _8 C# H$ k
理了理思路,重新做了一个测试。1 K, L: K4 y& B; G
做了两个 vector 和 两个 float *, 都长 100000
- M$ z7 ]# _- V8 [( `4 Y, n外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.3 N0 o- f2 J3 P! {
2 L8 m9 G5 V8 E) \' Z* C; T
内循环试了4种方法,) s7 G6 s5 b! W% l3 s
1. 直接调用 vector inner_product 247s 9 m9 s5 A6 @7 B. b' @* ]
2. vector 循环点乘累加 237s4 H' a# ~5 ^# X% n& n4 x+ R5 w! w
3. float * 循环点乘累加 204s+ O( b, g4 Q; T+ V
4. 空循环 100000 次 202s% J G5 K j4 g7 D* b7 E
/ L1 T$ x2 p; g2 N2 z
不做内循环 200s6 _2 a1 i% q- M% `
! B! p( Y. A$ N: j你昨天说的对,内循环本身占比是很小的,大头在其他处理。( H6 c2 r1 \( m5 t
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
& ?3 d3 u: Z; w8 Z# p
* {% a. g/ c. Y: X% v至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试). q, c6 A3 ?; I( B% t4 g
' [! [! x4 n+ E# y2 k# L(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)" C( D& a) ]; {0 r8 M
# [: \; {8 i. S% | std::vector < float > vec1(N);
( C8 b- ?* j5 z. g9 H/ G std::vector < float > vec2(N);9 ^0 q/ @( P" N2 K. e+ c X
float* b1 = new float[N];( `( O- M% D- f! |8 L2 w2 ?1 K1 j
float* b2 = new float[N];3 s" h& A& H! I+ G+ K
& f4 t y' x: ~' s for (int j = 0; j < 6000; j++)
5 s8 m( W; d- P% d3 b: c {# ]2 m3 W6 P8 M% z% f
std::generate(vec1.begin(), vec1.end(), []() {# w# G& I+ d) D
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
( g9 B- J h5 p+ o2 b& l6 K });
9 b) X: U( A4 A6 _
" \; M) q+ t, H+ Q# O0 S: z std::generate(vec2.begin(), vec2.end(), []() {
1 m4 y0 j: z$ R+ T return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;) u3 t" x# c5 O' `1 R# k
});: [: i/ T: Z0 A% P) F, d
2 `' G& O+ g. r& m1 R% i for (size_t jj = 0; jj < vec1.size(); jj++)
+ K# O9 y1 i T$ C- e {
$ W0 ^: T0 g: `! O! Z+ X5 c b1[jj] = vec1[jj];$ t8 L9 u, l7 {0 T
}
/ g! t3 r2 @; e; ]- Z/ ], R. `
- M- N- ]) T8 @# I" u" B for (size_t jj = 0; jj < vec2.size(); jj++)5 d/ _& B( o3 O7 A( ~& }
{& q9 l" k5 J$ E) m, k8 T) i) J
b2[jj] = vec2[jj];
$ Y: Q9 ?- M1 K5 B9 ]) ^ }
! D% f6 x0 \ |; ]9 G$ u# l
, Y# a9 F# l1 m" r6 y //Method - 1 N=100000 247s
* p) n/ j9 ~, h, ?; G% E //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
8 p H! U- D& Y& y 0 N, Y6 x: z' \
//Method - 2 N=100000 237s p4 r/ C/ s, i- x5 }
/*
. o' x8 j+ w. |, M, |5 A for (int jj = 0; jj < N ; jj++)# s7 s/ v: ?' H1 a/ h, h0 c
{
, O, h( x: B+ r% J fresult += vec1[jj] * vec2[jj];4 w2 c" [* \& A: o
}
# @ I5 j. z, n */
0 Y3 P' L4 K- M) N9 ~ n+ B* B $ m& N, x% U9 M& p2 Q7 X3 l, M
//Method - 3 N=100000 204s8 b( Z8 S2 m: p) Z- g& H: h3 G
/*9 |- V2 l9 b _8 m! c6 l: t! `& ~& j
for (int jj = 0; jj < N; jj++)8 b% o3 D0 W$ W- v" m9 l
{! b3 k" f" ^ v; g
fresult += b1[jj] * b2[jj];- k' C( n/ g/ f S4 P' |4 a/ X
}
7 d% \% @3 B9 e6 j$ q */4 n' e5 {( B) |$ \) i
2 O3 D+ x6 M) X1 p& j //Method - 4 202s" e+ O6 ?2 W7 y. j D4 b
/*0 f5 a: A7 ]0 O- ?
for (int jj = 0; jj < N; jj++)
2 E/ L5 |9 F' ~# H4 i1 _7 Z {
' V7 M' H' W. T/ R + i1 s" C- E+ c- e2 n' Q$ D" J
}; y1 q; E9 t9 @: ?
*/+ e% Y* h" z: r9 m k7 y0 e4 u5 I
//comment out all methods, N=100000 202s ' q6 U) d- @' W' X/ c/ o; U
}. q ~& m% m& D2 ~
( K, U" Y l" o5 W M5 N: W* n delete []b1;# C5 f7 |) k7 k2 h: Z4 X
delete []b2;
6 H2 I3 S; ^( C5 e1 G |
|