TA的每日心情 | 怒 2025-9-22 22:19 |
|---|
签到天数: 1183 天 [LV.10]大乘
|
本帖最后由 雷达 于 2022-9-27 01:17 编辑
* j6 z+ p5 N& i3 a3 A; S6 {5 _
5 u: T; j+ D3 |理了理思路,重新做了一个测试。
* J) z' d+ {) ^* K做了两个 vector 和 两个 float *, 都长 100000- E4 K: ~% x9 v! U6 Y
外循环 6000,里面先做随机数生成,模拟真实环境,避免数据的 cache.
* p4 [+ ^7 f. c, L9 w4 I0 P) b$ ~9 H$ n0 ^( M6 r2 d
内循环试了4种方法,
: Q# f" m, ~9 `6 \1. 直接调用 vector inner_product 247s
# p, Q) n/ c) \' ^5 f2. vector 循环点乘累加 237s
+ m$ F/ Z0 z; E; l( f$ [3. float * 循环点乘累加 204s* u# {$ Q# `- Q! P3 u4 r+ y
4. 空循环 100000 次 202s& o) |% L, H; m; ]% R5 N
9 R- c, h3 |# m
不做内循环 200s
/ N- `: m- q9 _8 E$ M( V% c9 E! q. _% G, h
你昨天说的对,内循环本身占比是很小的,大头在其他处理。( ~0 [$ ]4 i6 O4 e
另外可以看到, float * 循环点乘累加 并不差,比用vector 还更快。 s4 O/ ?, j, Y2 F) }
: W$ }# E' m! Q9 J! @8 t
至于我那个原始程序,还有一些疑问,见5楼,其他都不变仅仅是有无空的内循环就有很大不同,这是不对的,也许有一些其他缺陷我没有看到。(也许可以改成 while 试试)& }( J3 T" y4 I/ ^+ g3 E" U. c
6 O! h0 ]( j( _7 H( @1 _
(为什么下面我贴的 b1 加 方括号里的 i , 显示出来却是 b1 ?方括号 i 消失了。 LOL . 改成 jj 好了,原来 方括号里的 i 是斜体标志 LOL)
% P, l: |( ~9 V( |% z, J
% n8 f3 A2 ^ p0 I2 [% k5 l5 k3 x' E std::vector < float > vec1(N);
6 B$ g8 ]4 R. A' Y' w8 p std::vector < float > vec2(N);
- \4 h. Z2 x- M* o9 Q: l$ {% g1 @ float* b1 = new float[N];
z L7 {& w9 ^ j. k! y float* b2 = new float[N];
7 q+ B: L W( P4 Y% { C7 T9 l8 ~' y! I' R1 |
for (int j = 0; j < 6000; j++)
; J0 v) F# o3 e T# y4 D) Q& F# H4 o {: m2 p3 @% I& k! ^# g' n
std::generate(vec1.begin(), vec1.end(), []() {
# Y- ? S/ b! j& ~" G return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;1 }( [; n3 Y9 Y A8 m
});. {0 U9 Q3 g5 a& [
4 @. C8 Z8 ^( ]2 ?7 o& i; C9 v2 c
std::generate(vec2.begin(), vec2.end(), []() {
$ _. O% ^% W. S! O! s return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
% p& }& Q5 _. u" \, d! l4 ? });* X) E1 m# C5 ^% [* }5 @( {
/ L4 G% M. H, k( y- F for (size_t jj = 0; jj < vec1.size(); jj++)$ P) A! v# Z3 r, c% t
{
. G0 w/ g4 i8 k4 k0 a" L b1[jj] = vec1[jj];4 ^; g+ O1 }' `6 i$ u9 W$ d3 w
}
3 a% X) U6 w) ^5 ?8 I1 ?* {% W. B1 C6 t
for (size_t jj = 0; jj < vec2.size(); jj++)4 q3 l! J6 T( F
{ N2 G: z5 D% a% K
b2[jj] = vec2[jj];
2 u# P( C4 C2 F& v }
. [, w2 h3 m$ X5 c; p% i3 N$ ]- m/ m1 L$ b
//Method - 1 N=100000 247s
5 v+ @1 l' \& H% ?. T$ }6 y4 o# N //fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);7 x+ N1 \5 |0 U' D" l1 K& ]1 {7 a! X
2 x8 m/ K& t" s+ k5 J9 E$ [ //Method - 2 N=100000 237s6 M0 d B0 C' a. P7 h- O! e8 i4 K
/*
- l% T4 m0 S; Y for (int jj = 0; jj < N ; jj++)
! J: ]: Z* y; l9 J, l {* S3 u" Z5 R5 @( U
fresult += vec1[jj] * vec2[jj];+ o I; \! o/ Q& V4 v3 ?
}
" w H4 y4 Q# M2 P */: z& `# l l; J, X
9 X+ e8 Q0 ?/ N //Method - 3 N=100000 204s$ P* |/ ~+ s9 S4 G% u
/** D; |5 ]& y2 E, q
for (int jj = 0; jj < N; jj++)
5 [" `: T( {/ y: | {
, X6 \9 f% c2 S) r+ Y, G" N- V fresult += b1[jj] * b2[jj];
/ \/ D0 F, U; ^* z2 o9 O4 u8 t }
' y+ Y- H/ p4 _5 o% F */: m/ V. n0 d6 u5 e0 G, J& c
+ h0 L5 m" K7 s% \6 a0 k& n- L8 M //Method - 4 202s
$ Y7 m' D9 a, ?$ H/ I$ h' A /*9 E1 V" U8 A, m9 q5 j1 a9 j' ?+ Q
for (int jj = 0; jj < N; jj++)
) T0 G- c: a3 p+ j' ? {
" D; s; q7 u' U3 A0 a
- K: W$ E; d9 M; y5 U }
H( ?% O* ^ } */
- z; \( S7 `+ @4 k2 O //comment out all methods, N=100000 202s
& }. }6 ?. d; f. ]2 |- K. p. ~ o }
4 I5 P# y# m7 i; x. t3 O% v( L/ f0 e; d5 P8 \7 E* e9 X
delete []b1;8 e+ A( W- G; Z* v6 [* A: t; e
delete []b2;
* f; j/ m& \8 n ] |
|