TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
' x! h# j P, A; r- l. N, J
( j8 h/ _$ @7 V# N1 f- i( n理了理思路,重新做了一个测试。
4 y1 u- h7 |4 G+ y4 v" L4 W做了两个 vector 和 两个 float *, 都长 100000
5 s' F& m! s- P3 x外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.1 _+ Y: s' ~& p2 l
" @ k* a/ B9 ^% W& L' i. v
内循环试了4种方法,! N- f/ e: l( P' `: \4 A8 ^
1. 直接调用 vector inner_product 247s
7 U7 }' x7 T5 e: j# i2 x2. vector 循环点乘累加 237s4 R7 Y: J" k# s5 W* S
3. float * 循环点乘累加 204s
, R1 x* k; A# H/ P7 Y4. 空循环 100000 次 202s
5 h! E0 g! y4 j9 K2 w( v$ B* l
8 v# C+ U, H- S( {% P* f不做内循环 200s/ u6 `/ s) V% I. }/ J J
* }7 y9 h. N" ~% @1 l你昨天说的对,内循环本身占比是很小的,大头在其他处理。
8 \. H) X- J# _6 f另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。* T* o9 w: ^3 X( J, q4 l
9 Q6 G2 j. S$ [至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)1 i C( L7 b0 a; x# k
) K2 `" r& C- Q: s! p
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)" T6 z- X% S3 \, A% Z- p
1 g9 S. ?0 c+ j; ]5 N p" L) R- e
std::vector < float > vec1(N);
# g" l, l' K0 l6 S+ G std::vector < float > vec2(N);* j6 ?8 l2 N& R# l" Y. c
float* b1 = new float[N];5 C; {" ~: A7 K
float* b2 = new float[N];
4 m2 |8 p/ q! j' O: n
. x8 n6 h( d% ?* ` q for (int j = 0; j < 6000; j++)4 U* X; y( ~, j, a
{% A* B$ @3 E4 q" w' W
std::generate(vec1.begin(), vec1.end(), []() {
( r }/ v" ~; Z+ S: j8 _7 Z/ a3 S return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
6 z* _6 X' k0 C& A4 L) F6 b) u });. B3 K; f g- y% W& X& d- T
- ]; ]' B) A2 Y3 O8 y std::generate(vec2.begin(), vec2.end(), []() {/ ^% p. V. }% p- {/ I
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
2 J' ~, w, v2 {8 W. j. d* m });$ P3 z3 _5 ]5 ~$ f* L6 N7 B
! ~3 F* u. k* d1 K# G+ v4 \ for (size_t jj = 0; jj < vec1.size(); jj++)
! w2 [) U* \' z" f {
* U2 n+ K/ `3 Y, V8 Z% g3 A7 l b1[jj] = vec1[jj];
/ j6 A/ {9 C, \4 o }" t, e; I' r4 G" _% z5 U
1 n' P1 B1 `+ X
for (size_t jj = 0; jj < vec2.size(); jj++)- t/ p1 d0 K3 E6 y/ V" C$ K7 L
{% U6 i' J5 ^! X; c) ~" W- |
b2[jj] = vec2[jj];
8 ]; ]0 l6 e% Y0 j6 M }
0 V7 Y' {! F! y( J+ W, G" R' A. y; Y% l5 W
//Method - 1 N=100000 247s
3 l* B* [/ K' ^/ I8 v8 v //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);. v+ I. V y8 z, M& o
: p# u6 G2 ? a' X$ E( D- J //Method - 2 N=100000 237s/ r0 Q( E3 L8 j. W2 B, w. \
/*
; l! e- c% {, Y I: L2 B; E for (int jj = 0; jj < N ; jj++)
) v. B9 e F O( a* w1 O {8 y( B$ k" H" V/ P
fresult += vec1[jj] * vec2[jj];3 x6 Y m( e) g
}
$ h2 ~* O5 m K- @1 v" m r */2 {5 t+ |# `0 s" A( G' o
% M0 t' d7 D+ [! A$ J, v
//Method - 3 N=100000 204s
% w7 I5 g% L3 i& j, L /*
6 n$ @# L# K+ M& K( d for (int jj = 0; jj < N; jj++)5 h0 h# o- S7 { u2 X
{
- K0 A |6 ~1 K& Z# | fresult += b1[jj] * b2[jj];
* z4 ?2 c+ r3 Z7 H# x2 t3 q }8 u, X& O0 n* b: ~# G/ c2 p
*/6 \+ _/ c/ a: n9 B' Y
# x: S; T5 c0 M; p( b; M4 z# F7 \ //Method - 4 202s4 f5 j0 p; Z# l0 W! i
/*
5 l& J: B; Z: x* q6 j) k( }3 B for (int jj = 0; jj < N; jj++)
) y& j# T/ N9 B {; w" K. ], I3 n% n( f g
" W. y7 S* w) y }
' O3 F+ V a0 A! E5 [ */
) c8 ~5 D, |. ~! y //comment out all methods, N=100000 202s
" d9 R7 ]: Q* [& H }1 x% M) l0 f7 B5 K+ Z! L, _
3 X& y' P* P7 m: w delete []b1;& R0 \2 l2 Z) i& v8 O4 B
delete []b2;
/ x' S% E7 i- N5 n5 n0 p |
|