TA的每日心情 | 怒 2025-9-22 22:19 |
---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
( c# Z$ q( b; S# E* t, m/ {. X1 u. z5 f q) W. H
理了理思路,重新做了一个测试。* @& j5 Q3 z& Z; x
做了两个 vector 和 两个 float *, 都长 1000001 Y! o% ~, ~$ I0 g" b5 j
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
) N! d2 D. S: w8 C3 I7 ~
* j" g8 T4 I# Z3 o* \2 w内循环试了4种方法," ~# I+ d. ~+ N" D% I+ J3 j- H
1. 直接调用 vector inner_product 247s
1 m( Q ]0 k. y X2. vector 循环点乘累加 237s
9 [ A' a9 m$ P( m& u' V" P; [3. float * 循环点乘累加 204s
4 N/ a5 `; t7 O5 m) A4. 空循环 100000 次 202s+ R. X1 B2 Y, V- a# Z+ F4 m% R
8 k8 ]: H. i" }0 e/ j
不做内循环 200s
* b1 W- X" e/ K+ H* S( q% U# v n$ r2 _5 C! k& h
你昨天说的对,内循环本身占比是很小的,大头在其他处理。 p y3 H6 Q) U% l- i, a& Q
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
6 G! V0 @4 R n8 u5 i4 Z- t+ ?2 C
9 x9 K8 _" h. c0 H, T" f至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
9 A* R- w: a1 R- A3 `/ |
4 }, z" D6 q6 r/ {1 ](为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)0 ^1 i7 z1 a, b
* R \6 @2 ^* p
std::vector < float > vec1(N);# w. a. ^2 k* S$ c( J( S; F
std::vector < float > vec2(N);+ s# i! ]( ^+ @+ D$ f
float* b1 = new float[N];' G2 L6 |6 w- a" N5 M/ d
float* b2 = new float[N];
# o5 V- U; Y! P
* L& b2 u* o1 C& H9 r2 X for (int j = 0; j < 6000; j++)# g# c8 ]5 S) R& E. @. F. I& r
{! T8 f) V% }& @5 \2 \* l8 y; y
std::generate(vec1.begin(), vec1.end(), []() {8 @. v/ i- C8 z' L5 k. B( A# o
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;8 i8 a& X! y8 o2 Z0 C8 Y. j7 L: i
});1 O3 ?; G, w4 H6 @9 _
: t/ }5 [ r: F8 f! r: C: M8 [ std::generate(vec2.begin(), vec2.end(), []() {
3 i; u. R9 z& _. A7 s return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;! u% W4 K* l& f y7 O7 x7 A" T
});2 o' w6 ~0 J% D! C6 P4 i5 I' M7 N
& T [, ?) p0 z( b7 c% |1 \: {
for (size_t jj = 0; jj < vec1.size(); jj++)5 K5 g2 W1 U r! }. y5 h
{
* V, h- e# S N) }" j. L! G b1[jj] = vec1[jj];
( [: _( K# C/ q& {# b/ u0 h8 D }$ e. ` a& U) p
( P5 w( I( T7 h7 e( q5 y) T: Z
for (size_t jj = 0; jj < vec2.size(); jj++)
% @# |- x! u8 ^" [5 `* M* M {
6 ^' x) f* T( w! p d: d2 }! o b2[jj] = vec2[jj];
4 T4 A1 Q7 K( @3 U8 N* I }
9 e; w: V# ^5 k9 ]0 ?; Y" ^ r1 ?
& d; f; ?+ g( R* }5 r. K3 I$ [ //Method - 1 N=100000 247s , I' Z6 @& m& _8 s$ ]' }2 @
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
, \- ]- d; M, u; N
. T; F# x" q! E0 P //Method - 2 N=100000 237s
' |! C3 o" Y+ N+ ~/ f! U/ T /*9 r0 {6 w7 s' n
for (int jj = 0; jj < N ; jj++)5 [9 }/ g0 |6 t
{
$ e8 l+ e( Q6 @ fresult += vec1[jj] * vec2[jj];
3 D/ O; F: a/ E5 y+ Q$ C% z }
# x; B* F1 d7 Y# {: B0 } */( e8 B5 H* N* P; ]7 V4 M. c
9 z, F6 \& N. g# R$ ~0 L" G" N
//Method - 3 N=100000 204s
9 l( [) P! e" a, T N* r! _ /*. A* K4 ^6 j9 d* ^- O( u% v
for (int jj = 0; jj < N; jj++)/ K3 w4 [' l) G: u7 L) O
{2 t o2 L5 r4 L
fresult += b1[jj] * b2[jj];! K: X# g. W; X: |
}) ^7 b7 i+ B v8 \
*/+ E& L' v6 x) R0 e( n+ p. M
3 w* \3 S C4 W! ^( i7 ~
//Method - 4 202s4 ^' v8 O: v. @$ z. X# e2 N) i0 w q* q
/*# j+ z% I. t5 E1 t o
for (int jj = 0; jj < N; jj++)3 a3 I+ b7 [, o: L, X( S
{
* d0 p4 D% E5 \& X6 i 2 d: S$ L/ d; _5 {7 H f) p
}6 _. W+ t0 y2 s# e
*/, n- M; L. x; a% C( a/ U4 R3 r
//comment out all methods, N=100000 202s ) p+ X3 }7 h$ x
}
7 @4 F) L- T) d' e q7 o, _
$ h5 p/ ?. r) T% [* w/ g6 C delete []b1;1 I5 [: ~! }- g1 R6 ~2 m; `
delete []b2; ! B, i5 C0 ?2 z4 V# V" t G% ]
|
|