数值分析 发表于 2022-9-24 23:04
拉下来?拉多少?
把代码贴上来看看?
风雨无阻 发表于 2022-9-24 23:33
Maybe Debug mode?
雷达 发表于 2022-9-24 23:54
void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
{
comp temp, xtimesy;
数值分析 发表于 2022-9-25 00:20% ^- O: A" R: w& ]. L" \
这个不是这么比的吧。。。/ c6 z% N+ q$ i9 `" z% p
' ]' ?' Q6 X: u
您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
雷达 发表于 2022-9-25 00:46
有道理。
所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
数值分析 发表于 2022-9-25 00:20
这个不是这么比的吧。。。7 q# k: |6 N8 B' s
您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
而加上内循环,光jmp和dec指令就至少多执行了6000个
沉宝 发表于 2022-9-25 01:48
现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
沉宝 发表于 2022-9-25 01:27
你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
雷达 发表于 2022-9-25 04:47, i# `' O- T$ `' E
又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
雷达 发表于 2022-9-25 04:471 J/ t6 H& p- |! ^
又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
数值分析 发表于 2022-9-25 14:58) q2 {( U: ~% F% j
能不能把这个也贴上来,看看和上一个有什么不同?
std::vector < float > vec1(N);- l& ^! P2 m( |0 `, A, t9 v
std::vector < float > vec2(N);$ m5 D0 @7 ~# v4 W
float* b1 = new float[N];
float* b2 = new float[N];
for (int j = 0; j < 6000; j++)* q+ |2 H2 E% S8 a3 s
{: |2 S: Y- q: f3 }# Q- u' w8 S
std::generate(vec1.begin(), vec1.end(), []() {
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;' i7 s W' L9 ?' k
});; D0 t7 |! q5 `- n
% {, l* ?) C7 B ^) q
std::generate(vec2.begin(), vec2.end(), []() {5 X8 }/ d+ t0 z/ O
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;7 e" y) g4 H0 @ @# I
});- M9 q8 u- u* Q3 o( `0 t X; G* k& `; e
* B2 V4 \0 P. r% P. `( [
for (size_t jj = 0; jj < vec1.size(); jj++)6 N0 I. [1 {2 f9 O2 N: R4 l' A1 r
{
b1[jj] = vec1[jj];
}
for (size_t jj = 0; jj < vec2.size(); jj++)
{: V2 i) j; Z( v/ p3 C0 l& h% C# w' ~5 P
b2[jj] = vec2[jj];
}6 Q V4 O* }3 a3 e0 d( J% T4 I( U3 O
) T. E# D* R: |6 r7 {& r. C3 W
//Method - 1 N=100000 247s
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
//Method - 2 N=100000 237s
/*
for (int jj = 0; jj < N ; jj++)
{
fresult += vec1[jj] * vec2[jj];: g2 b0 p4 L1 A& ^3 t
}: y4 |. p `) w( A$ s
*/, {$ n: b9 ~) Z: S% G: w
//Method - 3 N=100000 204s: @. v& z. X2 f1 P2 R% _! X
/*
for (int jj = 0; jj < N; jj++)/ J9 h9 U$ e* C) K V! c7 W3 X4 b
{' v- j- `& F' N& o0 n3 w: Y
fresult += b1[jj] * b2[jj];
}( F2 w: w6 `6 [1 T& ~7 O
*/- Q6 ?; v9 G7 x
2 q- {3 R L4 {3 v' B8 K" Z! |
//Method - 4 202s
/*7 A/ G& i4 U! \7 A( q
for (int jj = 0; jj < N; jj++)
{* H/ z( a& o/ c" P* h: M+ E9 s
2 ~! e4 ]' J) `/ a
}& f: a9 E9 a' D v+ [& ^+ p& b
*/5 J: ~$ o# {$ p/ E3 G
//comment out all methods, N=100000 202s
}* w& J$ L( j: `5 @9 g
delete []b1;
delete []b2;
机器猫 发表于 2022-9-27 00:15
瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?2 Z/ {' x2 ]4 n# m4 j. U
8 D3 u" Q5 _& u1 v' i; W
你第二个试验里面的j在循环里面又重新定义 ...
雷达 发表于 2022-9-27 01:16
内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL* c% w! M9 v, l( b
不和它 ...
! l/ z' A0 c0 B0 N2 @6 e* M# {雷达 发表于 2022-9-24 23:54
void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)* G3 }- A. `0 i9 E
{9 V3 R% f; `% e/ q
comp temp, xtimesy;
雷达 发表于 2022-9-26 01:302 X. Y! I: Q$ j H4 T
理了理思路,重新做了一个测试。" T& K1 |1 u+ T C
做了两个 vector 和 两个 float *, 都长 1000002 d E6 J8 M0 v
外循环 6000,里面先做随 ...
雷声 发表于 2022-9-27 20:39; {: b+ T+ M- C# L$ i
这个时间是从哪里开始算的?; e ]( p" @( w% h
我怀疑这个200多秒里面有200秒花在产生随机数上了,真正计算大概只用了2秒, ...
雷达 发表于 2022-9-24 23:542 o3 Q4 p- q* M7 m9 e2 g
void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
{: G& ^; p9 `$ S: c1 C9 N4 @+ R( f1 E
comp temp, xtimesy;
opensrc 发表于 2022-9-28 00:29% X7 D+ k+ p+ ?! k# Q# G7 b
我有些迷糊,这样的code,难道不就应该时间差很多吗?也做了个简单的实验,你看看我做的有错吗
2 ?1 U- R1 \8 {8 Y
...
。 `3 q: Q% X9 X( F" D. J+ X

6 _/ l; q, i) @0 y0 J3 u| 欢迎光临 爱吱声 (http://www.aswetalk.net/bbs/) | Powered by Discuz! X3.2 |