TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 / K+ u1 Q4 m5 n' E
3 E& d1 m4 R s理了理思路,重新做了一个测试。
. K" M" A8 [, q% g4 J7 n R做了两个 vector 和 两个 float *, 都长 100000* |5 M- {! ~9 `# M
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache., x9 b8 S) ~- q
' s& z1 n( _9 l& h ?3 j7 C内循环试了4种方法,2 t$ F7 z4 ~1 M& i) k
1. 直接调用 vector inner_product 247s ' ^: j9 a5 v* W) h# {
2. vector 循环点乘累加 237s# V- X1 L8 \, u( g+ m. }$ I" m
3. float * 循环点乘累加 204s
0 I9 M& d9 J# E, m6 v( ?5 m4. 空循环 100000 次 202s5 l, g& T) P+ B+ w5 c
4 H$ M; H' r# q( n# B B, B不做内循环 200s# Y8 X* B I% k; r. i
+ h8 \* s/ s& ^( S5 f你昨天说的对,内循环本身占比是很小的,大头在其他处理。* h* Z# h9 n' R5 Q) A% k
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
) o! ^4 \( t. ~+ B
, U# G3 I8 f1 y [/ E* H至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
) m9 x0 n! g1 d2 T5 D# [1 h2 ?2 ^. U1 |6 v1 n+ t
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)* E& B+ z0 o. T( P) f
) u8 |5 A) ?7 M) G
std::vector < float > vec1(N);6 c* G( _, |4 U. H
std::vector < float > vec2(N);
; R8 y5 ?# s$ L, s( K0 K float* b1 = new float[N];
+ J. S( z& D4 [4 O! _# ] float* b2 = new float[N];
$ e5 o6 }1 e4 j( t" G9 q B( S" r d8 R
for (int j = 0; j < 6000; j++): o' X$ K) N, ]. _0 l! P
{& _) W# `, G% H" |- H8 J0 @0 N f
std::generate(vec1.begin(), vec1.end(), []() {
( E" T4 k9 L+ ?% N7 X( L' s5 p return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;; z5 E* x1 ?% W! |
});
% _6 }. B4 `, q9 M _: T8 B) c/ X5 P5 g/ \$ f- R
std::generate(vec2.begin(), vec2.end(), []() {
' j( V8 V$ [5 ? return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
5 p% J) U! S4 r o. _ });: I, [) ]( \+ }. e% p6 m3 V
/ i" S% L: _, n for (size_t jj = 0; jj < vec1.size(); jj++)( e3 w0 z, U- Y- i9 Q
{
4 C% r6 U: m) H: x- o7 v b1[jj] = vec1[jj];
# j2 b5 J2 b* Z# a4 } }
2 ?% {( O4 D+ }' B, W8 \' D! ~! u z' p# b
for (size_t jj = 0; jj < vec2.size(); jj++). O" o! |" x7 u. b# M9 k7 o& i$ z. y
{
9 N: Q+ L( r5 @ v% m8 v0 {: m8 Q0 U b2[jj] = vec2[jj];. A5 \! r& G7 O1 `6 C% P
}
( Z$ C2 [/ \8 G+ ^1 ~! U T% p( L
7 j* h" T, \( M# X$ t //Method - 1 N=100000 247s
2 a# O U3 V; M" }( _ //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);& p0 E! a) w* n
& |" {3 x# F# R" x7 @ //Method - 2 N=100000 237s
* Q+ i* f- o9 z" H: X /*
- j1 H6 k c; | h( i for (int jj = 0; jj < N ; jj++): q4 ^- z1 g+ N+ M; E' v
{
$ h! l! t* n# B0 R( L- C fresult += vec1[jj] * vec2[jj];* I0 R+ @: X% f2 a/ K
}
1 f0 N' R6 p& ~1 ?6 A. E+ `5 X */2 M. e/ m* N: U1 S" n T* i2 n$ Q
+ U+ O9 i) s0 z# F: `% Q1 m
//Method - 3 N=100000 204s
8 Z* c) R9 w+ O /*; H; _) }% A0 B1 `; b
for (int jj = 0; jj < N; jj++)
# l: [8 U, ^8 r; W {
9 \% r2 G& u0 h6 \; R fresult += b1[jj] * b2[jj];3 H% Z* M: Y# i( c$ c* ~ h
}
# }3 O0 ?! p5 t/ [* c3 Q+ x# s. K */
# i& D$ R4 `/ V% S; a3 {7 m3 A) D/ A3 s7 E/ x0 L
//Method - 4 202s
8 P M5 P" f5 }( X. I m /*
' z& h4 I: }; E& l! Q for (int jj = 0; jj < N; jj++), A6 S3 R+ B8 `
{
8 o- L) P8 o: e1 e, a' i( ? B6 ^4 i. }3 j, e8 }, [. h9 @
}/ k( D4 }) t/ u' R+ V) H
*/
, ]$ u1 s% A: i0 s2 a! M/ M //comment out all methods, N=100000 202s - l% o) R# v) A/ o( {6 a
}
" I; D! P/ `* {( F" t6 }- \6 I _$ [% _* ?5 D: n5 U E$ {
delete []b1;
9 j) w; p2 D& d2 a9 r3 n+ @+ ? delete []b2;
/ f% a) k/ Y/ e, s2 Q8 e) B |
|