TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 ) E+ M. L/ ?9 f
" O! ?4 ~, Z% }/ [( p: Y; R; w% l6 T$ J
理了理思路,重新做了一个测试。, A Q, I9 c6 M7 p
做了两个 vector 和 两个 float *, 都长 100000
, Y! o) f; J1 e0 u9 H; B- g3 W外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.- E2 o2 U1 @8 \5 L% M. q8 R
. s+ P; Y: E* J内循环试了4种方法,$ |/ K( X. s7 H( U) ~. {
1. 直接调用 vector inner_product 247s / L5 [$ O) A- K# |! l4 G
2. vector 循环点乘累加 237s
8 r( W$ J% V% \' {) n$ q w3. float * 循环点乘累加 204s
1 a- w4 x1 d3 A( _4 V* P/ U4. 空循环 100000 次 202s: i$ j2 F( {/ n" _0 }) j
4 w% l" S. K4 @, x# e3 c6 i
不做内循环 200s
( H" _ x+ Q1 r% \! k- \& ?+ J. z- N8 m& D" Q# N% m
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
' V L8 w( E9 E4 q. m4 R* R8 p3 V另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。; K6 C$ W* y% x& {, I; p) h
: y* X/ _( U- @
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试); `. c3 W t& G; i/ ~" |
2 S3 J0 C+ u3 F4 y( A0 l: h
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
- y+ h" x& j9 C6 J9 s$ C8 `
: n# [3 U E. x8 p8 G g5 z0 g std::vector < float > vec1(N);# ^# d) @+ P& g9 t1 k% [0 ?0 q
std::vector < float > vec2(N);/ p3 y- C( ^. a0 c e
float* b1 = new float[N];
9 c+ n7 C% u" a" e: T* E* { float* b2 = new float[N];
$ p3 e4 `6 Y4 a: A7 |$ N
4 F9 M n. u, Y7 m, q) b, ?- g( Q for (int j = 0; j < 6000; j++)$ Q) C1 Q6 \9 Z
{" e1 y3 R" x+ a
std::generate(vec1.begin(), vec1.end(), []() {& I6 t/ |3 A1 j3 d& D8 ?: b
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;- X) k" u& t3 y
});# N1 o7 @1 F+ O0 T
% t5 p9 L4 C/ E( G. r$ x2 I' l
std::generate(vec2.begin(), vec2.end(), []() {4 Q9 s9 A2 I# |
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
7 ~+ S: {8 @9 T });$ ~7 f& Y; I8 E4 x" E
& Y( _3 B" _6 F; J$ |
for (size_t jj = 0; jj < vec1.size(); jj++)
$ M) t+ h, J' D' G$ a# P' ^& Y {" d7 m; r3 S0 y% g1 n
b1[jj] = vec1[jj];
) a y: Y5 U7 `0 u }
# ^' a# b5 H3 J
+ Z' n* K) M5 c; O& k for (size_t jj = 0; jj < vec2.size(); jj++)1 I# z2 e" v1 i
{
+ A& e$ ~6 {" r" z b2[jj] = vec2[jj];
! X4 b' r) _4 c+ v2 Q5 ~2 J }' M2 x# W& E+ G$ e6 ~+ f5 [, x
d9 c) _% Y. A6 A5 C/ J //Method - 1 N=100000 247s
) C& b2 {: D- u1 n! n/ k //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);: q+ e* s; M# N M1 }4 U5 r# i+ g
2 z2 B5 J8 X. z! D2 g //Method - 2 N=100000 237s1 {$ ^/ [9 {2 r) n4 L
/*
) A# ^7 r# b [! L+ | for (int jj = 0; jj < N ; jj++)
: k% z1 ^: S' U. g' o [ {
. t6 O8 H% F) B- T! s fresult += vec1[jj] * vec2[jj];
/ q; m) V; \. a+ h2 u i' h }
" D2 G+ N+ f# W2 C$ h% S; n* x* p */: @- K$ ]5 g" Y9 N' T2 m
) p$ @4 v2 ?5 o9 { //Method - 3 N=100000 204s+ H; ?3 b& c. l* G6 L
/*
$ E& w7 ~) n) J* q for (int jj = 0; jj < N; jj++)! d/ x* l) n0 N4 |- V! A
{
2 p- J' c9 D0 M4 q2 ~ fresult += b1[jj] * b2[jj];
5 i& d6 s4 I- d# K' b }) z9 H3 R% P" U0 s k. t' ?4 K
*/& C1 |, d" [7 D9 S; f
) G+ e) C: W8 Z, U7 t
//Method - 4 202s8 E- Q F* b" h" S
/*. h; U5 ?1 z& L% Q
for (int jj = 0; jj < N; jj++)# J8 M3 M, p- o7 R9 H
{+ g8 E& a4 Q4 h# x
/ H) @7 E4 y, n- h" W# e; f, _. R
}
9 y# ?: G- O6 E1 c */% M& ]/ i; K- z) e1 T6 h" I
//comment out all methods, N=100000 202s ) O0 w4 r1 H" v$ A V
}
# m8 K7 {, b; H1 u c& q, h6 q$ ]0 [( | V. }
delete []b1;
: t" Z: O3 B& F8 r, f9 j delete []b2; 6 J' s- \* \3 z7 @) _& ~
|
|