TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 ( y3 D, n- W7 v2 e7 d
) M' y. W+ l. C
理了理思路,重新做了一个测试。
! U( S9 q7 o9 }做了两个 vector 和 两个 float *, 都长 100000
4 V- j3 \9 o, K9 h外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache., t. n |6 O. v8 l- {- D
+ o/ }) z9 c3 M
内循环试了4种方法,
( a- g1 J- r' \2 N1. 直接调用 vector inner_product 247s
0 L1 e l+ B# T2. vector 循环点乘累加 237s$ s: g9 b% @7 b8 p9 ^
3. float * 循环点乘累加 204s3 C6 k# t: c$ l% d# R/ ~7 Y1 x( i9 z
4. 空循环 100000 次 202s
+ F7 }% r q5 F& v# Z
4 [! e# l% `. K2 b7 Z/ v& P" W/ W不做内循环 200s
9 W1 Z$ K1 P% N2 q7 j3 N" Q8 h. M: R" n$ @- T! e
你昨天说的对,内循环本身占比是很小的,大头在其他处理。
2 u6 |# O" V' V3 G; o; D$ V+ @& P另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。3 O% C& Q& C$ r
0 s5 q' z6 ?. ] K0 M至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试) X3 _8 V, Q. P8 t n8 o
: k* m+ C7 g7 G a(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)0 ]" J; o p4 X' z I3 F, q4 r
& ^6 K) b* M" i7 M6 U9 q
std::vector < float > vec1(N);
0 K' _$ g! z0 X9 i4 y! J std::vector < float > vec2(N);
: l. a) n4 ]1 L F8 L8 ^ float* b1 = new float[N];. i5 R4 v, x7 e, A+ y I- e$ O6 A
float* b2 = new float[N];7 Z \# W+ u: |( e4 _! Z1 R
" D! x+ f+ P$ ^+ c8 b6 H; j for (int j = 0; j < 6000; j++)( W; Z" ]4 b5 L& C5 t
{
! S: x" J l6 V Z std::generate(vec1.begin(), vec1.end(), []() {3 Q/ g# j, e4 a
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
0 Y: e# J- h7 r });0 a& \1 ?; x( O
: M6 q% g4 O0 \8 X1 v
std::generate(vec2.begin(), vec2.end(), []() {9 `5 G1 T# j+ [6 F7 [* U
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;# K4 |& u2 q7 w# S7 d- o" q8 [! I
});% W3 T/ Y; o, \, |
+ a8 h* ?1 r; K5 P3 U- ` for (size_t jj = 0; jj < vec1.size(); jj++)
9 `2 y$ b+ |( l {% m5 B5 h9 M* r! P
b1[jj] = vec1[jj];% k" |' B$ G J Y" T
}
7 K2 J( d$ V4 o; s
5 p3 _# M& R, W% f. |, T8 U& r- M for (size_t jj = 0; jj < vec2.size(); jj++)
; c* E+ ?+ A/ V. K% T( M- i {
! A& |+ q" Y- Q2 A b2[jj] = vec2[jj];
& C7 r: k, Z2 K1 n( J8 V }9 k, c8 y9 b9 Z; Z
% @1 p' [+ P" `; L9 H) ?( c0 p( s //Method - 1 N=100000 247s " I( T1 y8 _! n" S1 X" a8 [0 e
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
( {0 C( o( u/ U2 [6 g ; j e0 i; I; C) v& F
//Method - 2 N=100000 237s4 h2 }" c/ E5 x
/*5 \" K+ g. t8 E
for (int jj = 0; jj < N ; jj++)
$ T6 P& @0 e' L5 Q q/ n {: \7 I; O9 s |3 h9 x& D) k3 W
fresult += vec1[jj] * vec2[jj];4 r3 k; k3 k' s4 O0 q
}
$ H% I1 j! z; f6 y9 A *// Q0 n$ i: S# z' f9 N
' z0 N- [4 e* i# w2 v //Method - 3 N=100000 204s% j3 p! K: x q* n, a" l, X( e. Z
/*
( H2 O p+ C* o* A for (int jj = 0; jj < N; jj++)
* W. `1 y% j6 F0 o {/ d( G1 ^' h% |, d4 ?3 n" }
fresult += b1[jj] * b2[jj];
% w. V! K7 d; h8 D7 P5 ^% p$ f" ~( ? }
" [, c- A Y# w- J5 {! ? */
0 P' y& n: c" E$ I/ l6 { p6 K
3 C- V$ {* Z ^) m" p1 t //Method - 4 202s
( o* {/ O/ c) ?9 V6 W /*
2 D S- R$ q I% O0 o4 ~ for (int jj = 0; jj < N; jj++), v1 \( [# Q6 ^6 a p
{
. s' D* o5 u5 S3 S$ F9 z
/ K6 Z, _) j; y. P m# ? }+ ~9 d; e; K. Z* H8 z# l" c
*/1 o8 H) o& F9 K
//comment out all methods, N=100000 202s
! X1 s M. t5 A, ] }
H- V) n4 T7 M' H) C7 G1 o# |" I- u3 v. z8 k$ X0 |( _
delete []b1;
c" u" o' x8 o( K$ P delete []b2; # k' b9 G: \: _* p* A5 c& J* i
|
|