数值分析 发表于 2022-9-24 23:04
拉下来?拉多少?1 j5 X. o7 ?! C' t
把代码贴上来看看?
风雨无阻 发表于 2022-9-24 23:33
Maybe Debug mode?
雷达 发表于 2022-9-24 23:54) E" C, e/ S0 \* F/ l+ p: |
void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)5 {- v: q, L* m9 O% V3 B2 R
{
comp temp, xtimesy;
数值分析 发表于 2022-9-25 00:20. `1 \+ _9 Y4 ^' R9 S/ }8 ?& k
这个不是这么比的吧。。。+ K2 s$ a- T( ^ K) W/ E
3 ~4 `: j, w4 I! P
您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
雷达 发表于 2022-9-25 00:46
有道理。
所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
数值分析 发表于 2022-9-25 00:20
这个不是这么比的吧。。。
您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
而加上内循环,光jmp和dec指令就至少多执行了6000个
沉宝 发表于 2022-9-25 01:482 K& _6 F8 U& ^" w
现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
沉宝 发表于 2022-9-25 01:27' i3 X2 g* q( f9 X0 o9 J0 B
你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
雷达 发表于 2022-9-25 04:47: k: ^* l" Q+ o3 k' j% y. J# q
又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
雷达 发表于 2022-9-25 04:47
又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
数值分析 发表于 2022-9-25 14:58
能不能把这个也贴上来,看看和上一个有什么不同?
std::vector < float > vec1(N);0 E5 u! k& w c5 z: N
std::vector < float > vec2(N);0 \1 x* f+ e4 S/ C2 Y
float* b1 = new float[N];
float* b2 = new float[N];* P6 l! H% d2 X$ ^( S3 ~
for (int j = 0; j < 6000; j++)
{# j9 w! n5 W1 B$ l' W" b% V" l
std::generate(vec1.begin(), vec1.end(), []() {+ a& f6 |$ S* }$ D
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
});
std::generate(vec2.begin(), vec2.end(), []() {* B- D/ M* T4 V m1 d& ]
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
});- G; z$ ~: e; X8 r/ V0 _/ F2 o
: _/ I* f* }' s, N2 E
for (size_t jj = 0; jj < vec1.size(); jj++)
{# v8 U4 @+ p6 A$ b/ H& V
b1[jj] = vec1[jj];4 r, v9 E; `. y7 r7 y7 ?4 ~
}
, h& O2 D7 @- J$ O( s
for (size_t jj = 0; jj < vec2.size(); jj++); g( S3 m" e) N0 U; v
{
b2[jj] = vec2[jj];4 H3 T) n H( m/ k% p0 |& P6 f9 j
}
//Method - 1 N=100000 247s
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);% T X# o$ o9 {" R9 b5 s: W1 U
//Method - 2 N=100000 237s8 } S: Z3 D; {! _+ j
/*. w2 l/ Z4 ~ q" J8 t
for (int jj = 0; jj < N ; jj++)0 u$ a+ L3 j4 x: C/ q" p; N
{
fresult += vec1[jj] * vec2[jj];
}
*/: f) N( \. j, N
9 {* Z a8 k- E$ I& l
//Method - 3 N=100000 204s
/*
for (int jj = 0; jj < N; jj++)1 }% X! Z: u; Y0 o2 G& e
{
fresult += b1[jj] * b2[jj];
}
*/- ~" T' e& h$ o4 @8 X8 ^
//Method - 4 202s
/*
for (int jj = 0; jj < N; jj++)4 X- J% d9 s+ b" t% Y# G
{8 ]; W: i( q1 k' S6 ]5 ~3 l+ n2 v
. S# e ~) J: _" j2 u P( g3 |
}5 o+ c. E6 }- a; A" m. C) Y
*/2 a5 Y2 C; t9 | \
//comment out all methods, N=100000 202s
}1 y$ V3 o; q) B" O- K3 a
delete []b1;
delete []b2;
机器猫 发表于 2022-9-27 00:15
瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?, z% n+ u6 Y' a
你第二个试验里面的j在循环里面又重新定义 ...
雷达 发表于 2022-9-27 01:16
内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL$ y8 a K) l0 I/ L
不和它 ...
雷达 发表于 2022-9-24 23:541 e4 H0 [4 A" `% U, U/ y8 Z
void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
{/ O; w. u/ a K- c, w* R
comp temp, xtimesy;
雷达 发表于 2022-9-26 01:30
理了理思路,重新做了一个测试。
做了两个 vector 和 两个 float *, 都长 100000, [3 m9 T5 P' G, h+ c, H/ P
外循环 6000,里面先做随 ...
雷声 发表于 2022-9-27 20:39( n5 O4 N: e _4 C% K: q
这个时间是从哪里开始算的?2 z" c# C; Q( q, J- a# r
我怀疑这个200多秒里面有200秒花在产生随机数上了,真正计算大概只用了2秒, ...
雷达 发表于 2022-9-24 23:54
void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)* k) i' b6 d8 C# Z# @1 s
{; R! ~$ Z: N7 R" \9 i1 ^ `
comp temp, xtimesy;
opensrc 发表于 2022-9-28 00:29( A& H Y' X2 x/ E* b! b( D
我有些迷糊,这样的code,难道不就应该时间差很多吗?也做了个简单的实验,你看看我做的有错吗
...
欢迎光临 爱吱声 (http://www.aswetalk.net/bbs/) | Powered by Discuz! X3.2 |