TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑 + g. \4 E8 W2 F0 e' x
& R, i# x6 M: X2 }% `! G$ z+ @
理了理思路,重新做了一个测试。
% T0 ~/ p: H1 l做了两个 vector 和 两个 float *, 都长 100000% v) I; @ W5 ] s4 G. [0 ?
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.! l0 t' s5 T& i8 m: t1 t, H0 W
$ }, N+ V8 z s% l, Y7 |内循环试了4种方法,
: b3 T S& A2 z" ~+ Z0 j n! N1. 直接调用 vector inner_product 247s
1 f9 _8 Y; i! F/ E2. vector 循环点乘累加 237s
( l0 x& K5 i" R3 B, _3. float * 循环点乘累加 204s
. \! N M8 a' ? ~ Q" [* X" Q2 a4. 空循环 100000 次 202s
' i9 V8 Z7 I# a6 y: i9 w7 p+ C+ R% Z4 d
不做内循环 200s+ [' \0 [4 o/ m" k
1 V8 D/ V5 s3 v8 K. z你昨天说的对,内循环本身占比是很小的,大头在其他处理。
# q% O, q& V9 e" L+ ~+ P另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。 B l7 e% e- U, d
2 C# |6 ^6 M0 U; x
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)3 f# s- ~- Z; S! H8 j
9 b b- @% d& @$ m1 @1 X(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)* n5 `) p7 K y: J
9 n4 ]; l! Q/ p1 V# }" l; y3 ~
std::vector < float > vec1(N);6 e, R9 O' j/ K
std::vector < float > vec2(N);% C1 U0 X5 G1 [7 f* p% O3 \8 p+ M
float* b1 = new float[N];, `# P* `# q. L/ \
float* b2 = new float[N];" F. B/ X/ X0 e% Y) K* S0 q
% V% x. P7 C5 L) X0 T: e
for (int j = 0; j < 6000; j++)
% T# @0 d; t" m/ U& l' B" `! T {
$ m8 P% _9 {9 h( [# j std::generate(vec1.begin(), vec1.end(), []() {
x7 G$ ^. J" Y3 S! |, K return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
, V d0 F( D4 J4 { });: T0 ]; c- p$ x0 C
6 [+ h6 ~/ t V5 x4 E
std::generate(vec2.begin(), vec2.end(), []() {5 e) w* r* q3 a, {: @ }) i
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;: t3 o* r9 J9 c$ b
});+ e/ [( e* z1 Y/ k+ r3 g
g9 I' V+ Z0 X! Y% q9 z' @ for (size_t jj = 0; jj < vec1.size(); jj++)
9 W+ ~. ?" n: E* f: ` {
8 }: ^6 I! Z: D. r b1[jj] = vec1[jj];
: t5 P( p$ J" n0 j% E2 v }% ` G, g: M# K( W# N: I3 r; l+ F
# k j* K" @* J1 O% t# F% s for (size_t jj = 0; jj < vec2.size(); jj++)) a# v! m8 `$ |
{$ V: h6 l1 P& U, j6 O$ T6 ?9 j( d5 a
b2[jj] = vec2[jj];/ n: \& X2 h$ n
}4 a" P- {0 n, W
9 @, F% E) c! L7 B' z0 o
//Method - 1 N=100000 247s 6 }2 o7 M# H- Y# M1 g
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
- K P) @9 w7 M5 q+ p: U$ l4 _9 ]
$ w+ C4 `" b* P //Method - 2 N=100000 237s* N) [6 C; `9 l5 L1 u0 V+ O+ A8 N
/*
" K- l: G, g X7 D for (int jj = 0; jj < N ; jj++)1 `* a5 z) G+ Q9 b$ I! q
{
$ y4 F+ `/ | w9 `* e% z fresult += vec1[jj] * vec2[jj];
) y0 r' g- p |9 {& f: Z7 P) ^. C }
! I9 W5 L2 g" ?9 s5 r9 U */: @( U) q% ^ h
4 F1 ?5 M, E' w0 n
//Method - 3 N=100000 204s+ l. u; [( B4 i; x0 `
/*7 P8 k7 l2 Y! q
for (int jj = 0; jj < N; jj++)
# K8 B* d v. B3 u \ {9 q$ \" E! I Y( C; p9 W; B3 q" `
fresult += b1[jj] * b2[jj];
/ D1 x: d9 f. S# j$ E4 m& l- T } [) r# F7 _: A+ p' Z! | s
*/
8 L# l- S# T6 _) g% u7 b% h; _! j6 Z1 }1 H7 |" |0 T/ Y! K6 c
//Method - 4 202s8 m! ]2 k/ c( ` W% `4 c$ T
/*
* ~/ k% n& J% r& y* |' I* P' Z8 l for (int jj = 0; jj < N; jj++)
& |: a! |, E5 @& p. N {
/ S- g2 z3 H" T) l; g/ a
( i1 ^5 }$ Y C: V$ o }
i- l% t7 J8 [ */
. b3 l9 F9 B' K+ k+ C* H* y //comment out all methods, N=100000 202s + x7 }, q) |+ w- h
}5 e6 _/ P2 v) e6 J+ V" r
3 M3 ~) k' U* A5 r0 r
delete []b1;
1 |) Z$ X+ `: Q delete []b2;
* [ X* E) [# I9 R( o7 E |
|