TA的每日心情 | 擦汗 2024-12-25 23:22 |
---|
签到天数: 1182 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 - m8 K. `7 z q$ ~. [
5 u! n0 A+ r3 {& j5 w! j2 {理了理思路,重新做了一个测试。# T# K5 i! B# n* p6 D! n
做了两个 vector 和 两个 float *, 都长 100000% i% w/ V/ ?; H$ R0 f2 Z3 {; P
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
& I+ a3 u" d7 M* R b
* [4 {! b( b" d: `5 g内循环试了4种方法,! w3 x7 g6 z- N2 C' V! i+ h
1. 直接调用 vector inner_product 247s
6 B2 b$ [3 M6 d; |+ ~2. vector 循环点乘累加 237s
/ J y/ K# P6 r# Q1 w @! u( ?9 Z3. float * 循环点乘累加 204s
1 ^) r: Z5 J1 Y( \) s# _4. 空循环 100000 次 202s1 o5 ]6 O7 p6 k5 o% C7 c5 c
0 v5 ^/ _' P4 h$ h不做内循环 200s% L; r- Q/ u) d$ H5 l% H' X" V/ o3 [0 ~
/ K% S6 E" g% }. r
你昨天说的对,内循环本身占比是很小的,大头在其他处理。4 q) U! u1 j7 j: j
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。1 S, N: D* Y4 k K2 h& l
$ y/ b1 N9 z- H, m- i& I7 v至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
+ [* Z; {3 t& k1 T- i% G* f+ n1 ~- O5 q
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)$ O: E/ h" n& z& Q- N
8 a! N+ O2 ?+ ~2 s std::vector < float > vec1(N);
4 N; ]& z1 \ F: j3 A$ e+ O7 x u/ ?. y. G std::vector < float > vec2(N);8 A; t# J( `, }$ m! N- [0 @& l
float* b1 = new float[N];+ d9 P! N- l' H5 ~8 U$ Z! Y
float* b2 = new float[N];% A8 D, a) j0 R% A
( g6 F& f) |$ ~& C for (int j = 0; j < 6000; j++)
: M( @: `' j3 ^/ O) l$ W {9 V, X/ Q7 e, R9 q9 h( x) y2 S
std::generate(vec1.begin(), vec1.end(), []() {
, i: g9 w$ J0 R) s+ v- @ return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
# e! G' R% ?: H" } y S });6 C( Q$ G$ Y( C1 |; y% t
% a3 _. B' C% J1 A9 N4 P3 U
std::generate(vec2.begin(), vec2.end(), []() {' \# c* c$ G0 w( m
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;0 R# c6 I: `0 ~) s2 a3 K
});
% P& @9 u- B: o9 n6 A
$ E- ~) B- r2 {1 B& c for (size_t jj = 0; jj < vec1.size(); jj++)
2 [. w+ {! _7 q0 ~$ Z {
' |; a1 f9 c- m) a$ X6 r b1[jj] = vec1[jj];3 Y% Y$ |' v* O7 @* I% A
}* {: z( k2 y( v y5 D- q
3 m# \& c' |; W+ }7 U% C9 i5 c
for (size_t jj = 0; jj < vec2.size(); jj++)* b) ~9 f5 U2 ~4 T1 t, n
{
$ B& G% l) a4 f8 G* {7 W! v b2[jj] = vec2[jj];' p, [7 J( P/ ~. V
}- C% l6 T& C4 b9 _. s# W( o
6 M v4 T% W ?9 y
//Method - 1 N=100000 247s 1 _) ]/ B6 w9 v! G0 `$ X1 n
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
' ]& O7 f% c7 f ! X4 q3 S4 ?; _9 ^' V& @' k h. O
//Method - 2 N=100000 237s1 j7 r- C* u( q8 Q1 ]1 P
/*
|0 a1 C9 F7 t2 _- F8 l. R for (int jj = 0; jj < N ; jj++)
/ M3 D* m+ e2 c. C8 w' W" p {8 y, `4 \/ K$ V4 }/ g. C
fresult += vec1[jj] * vec2[jj];! q( P' i: ]. Q
}
& |5 k1 l: M4 ?, P2 w */
5 R$ W( `4 i& B: K3 G( Q! ? - `) n; B; T. m: c0 s: V
//Method - 3 N=100000 204s6 Y7 g/ F5 o) K* P: W5 N2 C! E
/*
: y" D9 A0 ^9 @ for (int jj = 0; jj < N; jj++)
! {1 y' X/ D% ?) R! A" [! H$ I+ ` {0 k. \1 R6 s0 ~+ r P: D" D+ n7 h
fresult += b1[jj] * b2[jj];
0 ~; B( I) j% q' }. W- \( i }8 y/ s, e) S& c/ |, N7 ]
*/7 B5 D' I$ ]! e; u- p) H( }0 C
* t1 p1 S9 H c) {& W5 s% Y0 B
//Method - 4 202s
_. K( W2 v/ T% r( V /*- i5 g- H" X0 p1 X- T6 n% k! a# }
for (int jj = 0; jj < N; jj++)
5 o# L3 k" {6 F9 L2 P/ S! U { X1 M9 E- K1 |( \ p. h3 k
# o i: _( o; o3 a; J }
& d% k A; w' I8 F* g$ a9 w0 U */; v# o, Q) s% ^# [/ T8 @. J/ ~6 ?
//comment out all methods, N=100000 202s
1 ]9 K8 z2 z% |; F' K }5 I' x D& j: t
4 V9 |/ U- J8 Z+ `+ X& q
delete []b1;0 I$ T/ Q4 T% q. U9 M$ }2 ^
delete []b2; ; O( A4 m0 c( S
|
|