数值分析 发表于 2022-9-24 23:047 x, ]( w* G) ?# H/ I
拉下来?拉多少?
把代码贴上来看看?
风雨无阻 发表于 2022-9-24 23:33& B# v5 s. [: V1 t& Q0 N
Maybe Debug mode?
雷达 发表于 2022-9-24 23:54; S. T5 t% @' J+ \, n( q) {& m
void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
{) U, t$ v: g- k; s" Y3 {! L0 k
comp temp, xtimesy;
数值分析 发表于 2022-9-25 00:20" s' t6 h& v+ Y9 M
这个不是这么比的吧。。。; J! L3 F+ M- ^7 `# m$ B: J
您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
雷达 发表于 2022-9-25 00:46
有道理。
所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
数值分析 发表于 2022-9-25 00:20/ @' ~; X3 ?1 E# W+ G
这个不是这么比的吧。。。
$ _' s4 g% w, q0 ]" r K' u
您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
而加上内循环,光jmp和dec指令就至少多执行了6000个
沉宝 发表于 2022-9-25 01:48
现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
沉宝 发表于 2022-9-25 01:27! I' B3 k3 [$ W& K' e) r. U) y
你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
雷达 发表于 2022-9-25 04:47
又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
雷达 发表于 2022-9-25 04:478 s, J1 ?. \8 W
又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
数值分析 发表于 2022-9-25 14:58
能不能把这个也贴上来,看看和上一个有什么不同?
std::vector < float > vec1(N);
std::vector < float > vec2(N);/ l3 h+ R+ @0 P- [8 v
float* b1 = new float[N];1 m% f% p) i! j* J/ a# c! |
float* b2 = new float[N];
for (int j = 0; j < 6000; j++)9 H \8 P4 g, S$ Z
{
std::generate(vec1.begin(), vec1.end(), []() {& j) t4 U/ X8 f0 V* \1 u
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
});+ D4 a; L2 v8 v! i
std::generate(vec2.begin(), vec2.end(), []() {
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
});
! L* o6 d7 T/ z# u0 E2 Y
for (size_t jj = 0; jj < vec1.size(); jj++)
{
b1[jj] = vec1[jj];
}+ X1 {4 A8 J+ `
for (size_t jj = 0; jj < vec2.size(); jj++)
{
b2[jj] = vec2[jj];/ }( B& y' C& C7 y$ e& |/ j
}
: I3 f" Q+ ?+ @9 J7 l0 W. w
//Method - 1 N=100000 247s
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
//Method - 2 N=100000 237s5 O# ]( z: b* M7 Y; e5 A
/*! E! N# q- `0 g! F6 \9 o- A6 I
for (int jj = 0; jj < N ; jj++): x. O1 g) ^% H3 b5 C1 g
{
fresult += vec1[jj] * vec2[jj];
}+ o+ s/ e% Y p/ ?
*// ~2 j4 x1 m j
//Method - 3 N=100000 204s
/*, B; Y. Z ^( Z" Y4 V
for (int jj = 0; jj < N; jj++)
{
fresult += b1[jj] * b2[jj];3 f) Z0 X# J1 J3 d+ d
}3 e. R8 c4 N& Z; J0 ~
*/( k6 T% a: l# {
% c" m5 U" m. T2 p* H5 _
//Method - 4 202s
/*3 i: M+ L$ P2 }$ h
for (int jj = 0; jj < N; jj++)$ q; w1 e8 R5 {) ]: Y
{
3 L8 O7 @6 E' m6 z3 E6 F3 {: f; v! r
}/ v, a% S& s8 L! @
*/' Y; m4 P6 e2 t, n
//comment out all methods, N=100000 202s
}# P0 t! Y, E9 A# |4 g1 z
. K: Z. @5 y+ O8 {8 N
delete []b1;7 F |1 U5 V+ n
delete []b2;
机器猫 发表于 2022-9-27 00:15
瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
1 O( V! ]: c$ H G# w" s! g
你第二个试验里面的j在循环里面又重新定义 ...
雷达 发表于 2022-9-27 01:16
内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
不和它 ...

雷达 发表于 2022-9-24 23:54
void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)8 p5 ^7 x5 b: O. h
{
comp temp, xtimesy;
雷达 发表于 2022-9-26 01:306 q5 h: y' ]& C( `3 N* e
理了理思路,重新做了一个测试。4 T2 @, J; T s; Y) Z5 L4 o# ]
做了两个 vector 和 两个 float *, 都长 100000
外循环 6000,里面先做随 ...
雷声 发表于 2022-9-27 20:39
这个时间是从哪里开始算的?& `- S. o8 H! P' I
我怀疑这个200多秒里面有200秒花在产生随机数上了,真正计算大概只用了2秒, ...
雷达 发表于 2022-9-24 23:54
void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB). u* n( ? G8 f; O1 U
{5 T8 e$ J: f$ n0 B# z& c
comp temp, xtimesy;
opensrc 发表于 2022-9-28 00:29+ _- `7 V. f% c9 \6 G
我有些迷糊,这样的code,难道不就应该时间差很多吗?也做了个简单的实验,你看看我做的有错吗1 h! j. p/ V2 t. h! N
...
。0 t3 Y+ c2 z1 t/ E4 M: q


| 欢迎光临 爱吱声 (http://129.226.69.186/bbs/) | Powered by Discuz! X3.2 |