TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 / q; f! ?0 k3 L0 ]
% |4 y9 P% e/ k f/ j, \# l, ?
理了理思路,重新做了一个测试。2 [( b |8 e( l& C9 ]
做了两个 vector 和 两个 float *, 都长 1000002 f+ |' g0 {, h5 y
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache." A# i+ H2 z* _, E
! R) j9 X3 c+ r8 a
内循环试了4种方法,
- N; K& M$ _- w5 ~. j- i, r1. 直接调用 vector inner_product 247s ; [( ]! |- T4 [0 P0 k7 p; z% R
2. vector 循环点乘累加 237s
+ ?7 I3 p$ z) l4 B3. float * 循环点乘累加 204s
; t! I \9 f3 }, |7 o4. 空循环 100000 次 202s/ R2 W& H" E+ q( h3 @6 `
8 [* o: U* l, o( |- h; f不做内循环 200s
( k" c8 r8 ^+ S/ r9 N
+ f' V& N5 I! Z9 s$ J) }你昨天说的对,内循环本身占比是很小的,大头在其他处理。% f& ]3 T7 T1 ^7 Z$ z/ J
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
6 Y! r9 N0 q& W* L) Z
+ A3 \! `' c( u4 v1 {至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
- q. Y1 t# Z5 g9 k$ O8 G
9 b t% j0 y- o4 R! _0 z+ T(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
7 U0 P7 x' H, b8 y" D% b2 m
2 Q+ m w: J+ w% t std::vector < float > vec1(N);3 R& x7 M* w* J
std::vector < float > vec2(N);, }% g( A/ V0 B$ H$ l+ n& B
float* b1 = new float[N];) k3 S: c, x+ O: j2 x
float* b2 = new float[N];
: w% t$ O: `! S* G. }
P5 z1 A" ]; y+ U4 i: ~8 g% ^ for (int j = 0; j < 6000; j++)
2 V' N9 v( e$ S. { {
' j# ~5 S* Z1 k5 ^5 w D std::generate(vec1.begin(), vec1.end(), []() {
( \: J, L/ g7 }% m' U return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
& X' e# b# N5 _% Z1 j7 j });
; w$ c: q8 X6 \: {0 r! }2 Q h: p* I/ ]
$ {% k& n8 g7 u std::generate(vec2.begin(), vec2.end(), []() {9 t6 I+ A+ ~' G% O3 m
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
9 i x8 A3 y) N* F) T6 i });7 \: j0 J5 { Q1 }. i; a
9 T9 H8 G( B1 X" ~! Y for (size_t jj = 0; jj < vec1.size(); jj++)# b3 o& G2 S) v& b. V. v6 y
{
4 [. C& R' X5 X" `/ z b1[jj] = vec1[jj];7 u6 @2 P4 K6 ^9 |+ B: p: c
}* @+ f d: R5 s! ]1 a
# C5 ?' q7 a: i: ^9 } for (size_t jj = 0; jj < vec2.size(); jj++). J3 V' L( w$ i. p+ u
{
3 P) z/ u3 e6 A$ z b2[jj] = vec2[jj];' R# P7 m* W0 A4 F7 n) r
}$ [& _% ^$ j7 w/ y% d
& n3 C. |; ?4 e. e& V/ F& r
//Method - 1 N=100000 247s % i9 f, O4 R* ?, W- A( [( ?
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);: V4 ?. B: J; F3 @3 S
4 h, \" {8 g$ q! b5 \' C
//Method - 2 N=100000 237s
2 Q. e6 }+ Y, e" U5 L /*! Y, c# R3 k0 @; D: {& W- m7 d3 _
for (int jj = 0; jj < N ; jj++)3 Y5 S( Q8 A3 N
{
+ q. o# e+ z0 ^# W- Y6 q% r3 B% ` fresult += vec1[jj] * vec2[jj];. a6 t% A% n: g+ s+ A/ p
}$ q$ p! M( U9 @( ]" s
*/
8 x6 B0 I7 j: X* | ) d/ f5 R3 H$ o0 b7 N2 \ b$ C& H
//Method - 3 N=100000 204s
/ p+ b& a2 G4 S4 Y5 ` /*, q; y' @4 J9 K% I7 p) Y
for (int jj = 0; jj < N; jj++)
4 J3 N8 V) |: B, T" ^ {
2 c! d6 x! X4 Y; j2 X0 H fresult += b1[jj] * b2[jj];
3 x' U# m6 o c1 x. y) v }# L# L9 k# p6 u$ e
*/ p+ [- X/ G r/ M$ L2 b
: B9 I$ M/ i4 ], R0 }! g) g' c+ S
//Method - 4 202s; H8 G* F6 c9 u! C' D
/*
( f1 L. _5 L* k1 j+ ~! ]% S1 p for (int jj = 0; jj < N; jj++). l& v* X% c/ C7 E0 m
{3 p' K5 i _" s2 {; y ^* b
* m) ~7 `* _$ R$ X: ]4 Q* C& i }, w6 }! H" T" K. I( K
*/4 x: E# E' V1 j; W9 E. D
//comment out all methods, N=100000 202s
# t q, Q; T2 F/ P }
, Y- o) {3 @* _2 n6 g% S F) f; K- J3 ^8 ~9 @) f9 |1 ~
delete []b1;
P( w8 C" @* {1 l: F delete []b2; 5 b1 K: k& l6 h5 t7 p- o
|
|