TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
5 x) w, K4 c9 i+ `' ^) V
2 z9 A. U2 _8 t0 S& Y o: e( W理了理思路,重新做了一个测试。/ @( M# f8 }# [' I
做了两个 vector 和 两个 float *, 都长 1000005 l6 Q c p4 r% Y4 y& X7 j& R5 K
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.& ^2 s$ W, G2 R, W8 U
! l2 K5 c' u) n) p
内循环试了4种方法,
( |) f$ _0 u" Y1 w1. 直接调用 vector inner_product 247s
7 p) P; t* Z h. w2 N' k2. vector 循环点乘累加 237s0 l" \: n6 l+ _, ~' L+ ?9 v, I! E4 \. y
3. float * 循环点乘累加 204s
3 C! o+ U' E! C9 Y" S4 F W4. 空循环 100000 次 202s
7 k9 Q9 G% d) }1 u, e7 m& x% o2 E# p$ j d7 {0 C3 q2 Y
不做内循环 200s
9 l7 \- S. h7 l7 m: i
" Y o) O" t8 G+ X你昨天说的对,内循环本身占比是很小的,大头在其他处理。" N+ v$ j8 x3 x/ V- H
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。* {" d( k4 h9 e- H. d" _+ S$ U
5 e( z; o) Y H `+ ^至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)' O* N7 @8 J8 j: p3 n( R
' G: W& u/ }* E9 c) r' y
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)0 n$ C6 C5 ^! }+ h2 Z2 x# U$ d
/ k& @; f" F3 Z8 H* m7 n. X std::vector < float > vec1(N);
9 a! O5 V+ P$ o7 h1 N std::vector < float > vec2(N);7 b# n0 } w: s# L
float* b1 = new float[N];
3 ?0 P; Y+ ?; e( S9 Z7 ?) g float* b2 = new float[N];" S+ @1 t7 Y# x% i+ Q
& o3 o; _+ A/ F* d& ^1 M6 W7 |! z7 Z
for (int j = 0; j < 6000; j++)
9 a4 q! {: v$ O% F$ X {+ J r4 l0 C6 C
std::generate(vec1.begin(), vec1.end(), []() {# ]" Y& Q- h, ]8 B# ~
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;0 r8 ^" T9 _6 o% v4 n5 Y3 ^
});
0 s# R+ c# V* ]$ J1 {7 N0 W
. i8 ~' N& z5 C* c. P3 a k/ [ std::generate(vec2.begin(), vec2.end(), []() {5 _+ k, u6 l# G3 U( G" j
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;: M$ p: K/ x3 O
});, J; w( E% p8 v7 i
. A& B: [9 n; t( g; g5 ^
for (size_t jj = 0; jj < vec1.size(); jj++)$ t* r7 A# E- s" h
{1 m U; c Q V( `
b1[jj] = vec1[jj];
1 A; C7 X ~0 ]) Q' y! s& T/ g6 r1 J% s } H$ A! ?: s1 ]8 t4 i
/ X' f# J! O4 X for (size_t jj = 0; jj < vec2.size(); jj++)# d; I+ h: x; v
{6 V+ T8 N# j* t$ e, p
b2[jj] = vec2[jj];5 Z/ v4 J W; @. ]0 t
}
k% ~* _# N3 h, I# ^6 |# A& b' W/ D0 z8 h" G
//Method - 1 N=100000 247s 9 F C/ X, x1 a. f$ j
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
. T+ L9 M* Z9 O1 U2 n# f6 d' U $ B& |; s7 B9 U# n% O4 y c7 J; F
//Method - 2 N=100000 237s
5 w0 ?: W/ @8 B5 w/ p3 l /*
. T3 J3 t: R9 n; \4 J- F/ p) {2 I for (int jj = 0; jj < N ; jj++)% [5 z, u/ Z, n3 y, O1 c; p
{
( T" ^8 T$ Q1 r" d fresult += vec1[jj] * vec2[jj];
" T, L$ L4 i" e/ j5 X }& n& W1 _) B/ ^/ j- ]) K
*/
( \+ f: _& k6 ~% x1 R, c9 V , }4 G0 g7 l2 m4 y
//Method - 3 N=100000 204s
# K& K/ ^$ D% h5 u7 F /*9 P+ q8 k* M! w$ k$ Y7 ]
for (int jj = 0; jj < N; jj++)
8 {, S% Q; T7 d$ u {
! a. s4 {, `' h; ^9 K fresult += b1[jj] * b2[jj];
* ~( j" g1 S, ?, K; X) H }2 [: i5 K# u9 o! N5 @4 J
*/
& u2 K2 s7 Y9 z
0 Z( h( {0 m6 ~/ n //Method - 4 202s- X }& B5 A2 j5 r7 a
/*
, `- B" f; ? } c7 j% A for (int jj = 0; jj < N; jj++)9 ^8 n3 W& r5 K9 Z8 Z2 g, T" J
{
) ]- r0 {: I( k3 A, ?* M: r
) m( ^6 C j* [ }
4 w' t5 _5 e7 w8 K( H; P2 a9 b */' N- S( Z; c$ R
//comment out all methods, N=100000 202s . s6 N: q, k6 x8 F+ J* c6 Y
}0 O9 b, x5 n) S+ y
: a( _+ T8 z2 ?# h4 f6 J9 ~ }
delete []b1;
. u. `* g3 q9 q% n$ M delete []b2; 5 k% }8 S" }/ y6 l
|
|