TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 * P9 m4 _" S* q( K& g K
( `; i: X5 N2 E7 ?5 W: K
理了理思路,重新做了一个测试。# k3 v1 S' }% z; L4 ^
做了两个 vector 和 两个 float *, 都长 100000
x/ L; ^1 ]7 L7 S6 u6 B# t外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
. e6 k5 X7 w- i! n) L7 D# Q* _, ^" x6 X' Z8 G6 Q
内循环试了4种方法,. ^- f8 o( w) h* U1 q" l5 _% S
1. 直接调用 vector inner_product 247s
3 H% W% E6 I p3 t2. vector 循环点乘累加 237s7 m+ U3 e ?+ A) q+ h
3. float * 循环点乘累加 204s, G/ t# U3 ^- }+ S5 P
4. 空循环 100000 次 202s5 E, B9 F0 A" j
# Z, O) w0 S E4 R- O0 i不做内循环 200s
" c( s% r N* I) Z- y0 y, b; M6 }& i) K8 m# j5 n+ Q, |
你昨天说的对,内循环本身占比是很小的,大头在其他处理。/ O) J1 x2 `" D1 `3 M" ?
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。
3 N4 u. E% |$ T. }3 ^4 {
' N7 a$ |; f4 |" f8 Q' a2 Y5 X至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)
9 `* y" p% b( R! {0 F& @4 x2 X( W X: ^( @% e( s
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
5 s; j& b( U. Q U5 V$ h" s8 \$ i$ {( b! F( ^* j' C
std::vector < float > vec1(N);
- w7 O' q3 u) n! c. l2 G; S- V std::vector < float > vec2(N);% b" z$ n/ n2 Q; s$ x% @3 K
float* b1 = new float[N];
; H# p4 f, [2 s0 o0 L float* b2 = new float[N];; U/ z: g! H2 y8 j! @
! x- S. m! {! i* `2 T$ Y s# C for (int j = 0; j < 6000; j++)$ X; G' j+ a% E% _
{ j: d( k( V$ j8 c r
std::generate(vec1.begin(), vec1.end(), []() {/ g% C; j0 x. b( g
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;# b0 L6 T0 y5 K) R
});
6 U0 N3 e; S, G/ A! b
! x' _6 R7 y! D6 L# z std::generate(vec2.begin(), vec2.end(), []() {
" B$ j* B& F$ p/ Y, n% N- | return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;* n, [' {8 W8 L& S V# ~. f4 Q
});) N8 ]* k) n8 j3 g5 X2 i5 O+ f* x# K
1 L: P& j4 @5 J3 Y for (size_t jj = 0; jj < vec1.size(); jj++)* t7 D3 O: X) U% k! F i
{$ Y0 R/ `. K `4 n1 c% ]
b1[jj] = vec1[jj];
7 p: a, K9 M6 S+ P }
+ J5 j2 B7 \# F1 w- o2 Q* o2 F) Z# N5 t1 q' O8 P
for (size_t jj = 0; jj < vec2.size(); jj++)! V( c9 w3 H5 ~) p
{' ]- F0 ?; B. _
b2[jj] = vec2[jj];: g% h Q; X2 s. L* C& r5 n
}* \1 x. E, W( M! c: x$ p8 U5 K/ d
4 R: y6 D Q: I) }) g
//Method - 1 N=100000 247s & o! R( c- G0 r. D7 d, z) b9 Z
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
& X, N! }& N/ C# T / b7 q3 U( X( T
//Method - 2 N=100000 237s
; z# F+ }) g6 P /*
+ Y4 v/ S- G: s* C8 W for (int jj = 0; jj < N ; jj++). R, X7 h0 E- \) o& I# R d7 X
{
0 A- r2 p5 _6 m; }2 X2 I fresult += vec1[jj] * vec2[jj];6 }6 _1 Q2 J3 z$ F' |; N. {" b( s
}
0 a, M; r- m5 e' f, } */ l1 f0 n! s- o7 K3 d% A
2 m) Y2 H+ c7 A4 X9 F //Method - 3 N=100000 204s$ L L- _' O; P
/*
& T. f0 z2 [7 g8 f- I, j6 x4 ~8 z for (int jj = 0; jj < N; jj++)! |9 o g6 J: G7 q$ t2 @
{
& i( ~4 ^. O, x } fresult += b1[jj] * b2[jj];/ N5 l9 G" S& V6 C4 d, F/ W {
}* y) r) ]3 w" k
*/! Y( p" m! U' ^1 G7 q4 S% K- @/ I
2 O n, G" I. T) j
//Method - 4 202s4 Z! X0 N2 o5 I; Q. ^) A& \
/*3 U r0 I) D5 M: ?
for (int jj = 0; jj < N; jj++)( \, T, K M$ r$ x0 m
{
$ O6 A! I* W8 L/ e1 H# H6 t# }8 z
+ b" l7 ^2 ~, c4 G4 v7 P7 K }
; E! T3 p% J& `4 y6 U( ?8 y */
# {* x4 p! n. N. W' Q //comment out all methods, N=100000 202s
X5 X4 W& ^+ b7 F% s2 d9 i }
3 F0 u# U8 s- k* Y9 U8 B- V
4 a$ l3 y1 H1 d: z3 p delete []b1;
! Q( W' t* y5 u delete []b2; 2 d4 _ L7 ^, w( {7 W( c/ d5 h# U
|
|