数值分析 发表于 2022-9-24 23:04
拉下来?拉多少?
把代码贴上来看看?
风雨无阻 发表于 2022-9-24 23:339 Q/ Z* X( [% N: X3 C
Maybe Debug mode?
雷达 发表于 2022-9-24 23:544 G9 K7 H9 \9 ?! O- V% B
void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)$ z; X$ Q/ L- r4 f
{. t0 [' I7 G- n% |. U) Z' L2 u- G
comp temp, xtimesy;
数值分析 发表于 2022-9-25 00:20' u8 v3 V+ ^/ m d6 _( y( B
这个不是这么比的吧。。。5 H2 |! j) m; u ?/ ]
, X2 V+ ?, E; k. D# w$ W
您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
雷达 发表于 2022-9-25 00:46) c6 J% t# E+ ]3 g4 o* {* m
有道理。
所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
数值分析 发表于 2022-9-25 00:20
这个不是这么比的吧。。。
您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
而加上内循环,光jmp和dec指令就至少多执行了6000个
沉宝 发表于 2022-9-25 01:48
现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
沉宝 发表于 2022-9-25 01:27. \' Q( [+ v8 c& T
你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
雷达 发表于 2022-9-25 04:474 I/ z2 @& O: ~. h% j* R3 ^
又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
雷达 发表于 2022-9-25 04:47
又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
数值分析 发表于 2022-9-25 14:58# j. b% N. |& m* A. X$ \$ M
能不能把这个也贴上来,看看和上一个有什么不同?
std::vector < float > vec1(N);) J7 A! q) X9 z2 |( ]
std::vector < float > vec2(N);, v: G9 E7 T" K4 w9 [' c+ _- M% d1 F
float* b1 = new float[N];
float* b2 = new float[N];
: U4 E3 G7 ~$ ^! U" |
for (int j = 0; j < 6000; j++)9 n; k" ~1 @, N% f' T# Z+ D
{* C/ S) L2 X( }, c- D. f
std::generate(vec1.begin(), vec1.end(), []() {
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;1 W6 n; m$ M* G" I
});
std::generate(vec2.begin(), vec2.end(), []() {
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;2 |' \0 ?7 M0 ~, T$ K+ J' c
});
for (size_t jj = 0; jj < vec1.size(); jj++)( V# p( f6 P% }! x; v
{
b1[jj] = vec1[jj];" T2 m' t0 [! t) n' k/ Q
}
for (size_t jj = 0; jj < vec2.size(); jj++)( D0 Y7 _% c* @9 n1 q. W
{ I4 Q! V8 y( p: y, |: I, R0 f
b2[jj] = vec2[jj];
}( G2 b& x( V- o7 h% s9 d
& H# V0 \9 [0 |
//Method - 1 N=100000 247s " r' s4 n4 d/ Z" J
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
//Method - 2 N=100000 237s
/*; I4 v0 Y# ^$ N
for (int jj = 0; jj < N ; jj++)# a% ]' r5 [* p& d
{
fresult += vec1[jj] * vec2[jj];8 C t7 X+ T, J
}$ A9 O7 q/ m7 ~0 f
*/
2 C2 R7 _+ @0 n- E
//Method - 3 N=100000 204s$ N7 v" a" c& r/ b0 z
/*
for (int jj = 0; jj < N; jj++)
{
fresult += b1[jj] * b2[jj];' a! c; A; F+ L4 f0 M
}7 L+ \" e1 m' [+ E0 z& ~$ X3 F
*/1 n% L( {7 G3 k0 O6 D
- `( s `7 r4 K3 x0 [5 J
//Method - 4 202s
/*
for (int jj = 0; jj < N; jj++)3 h' {; l {9 J3 D3 f
{( k7 G9 a4 P& b. C
}
*/3 v9 R5 p9 g$ d+ H3 W
//comment out all methods, N=100000 202s 5 c- f; r- m: }" Q6 f# f
}" O. B9 r3 L& h- N4 T
delete []b1;5 D% ?# t$ l6 e
delete []b2;
机器猫 发表于 2022-9-27 00:15. d0 c' a6 F2 g: I
瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
' }+ D3 N0 k4 V4 [" `7 U, \
你第二个试验里面的j在循环里面又重新定义 ...
雷达 发表于 2022-9-27 01:16
内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
& G1 j1 b( g! l
不和它 ...
6 d0 d, r7 K. A* r/ P雷达 发表于 2022-9-24 23:54! n2 \) R0 n% o& u I# y( z" ]
void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
{* A5 P2 U; t$ z' K' W( \( X
comp temp, xtimesy;
雷达 发表于 2022-9-26 01:30+ F6 Y; ~- X" l4 f4 E, [
理了理思路,重新做了一个测试。6 J& L8 Z' z) X7 Y/ n
做了两个 vector 和 两个 float *, 都长 100000
外循环 6000,里面先做随 ...
雷声 发表于 2022-9-27 20:39
这个时间是从哪里开始算的?
我怀疑这个200多秒里面有200秒花在产生随机数上了,真正计算大概只用了2秒, ...
雷达 发表于 2022-9-24 23:54: f" d- s$ X, N
void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
{) c* |3 y' p* Y% _
comp temp, xtimesy;
opensrc 发表于 2022-9-28 00:29
我有些迷糊,这样的code,难道不就应该时间差很多吗?也做了个简单的实验,你看看我做的有错吗
& q* ^: v. c& S- S
...
。

3 [+ D/ i' H: k4 w) J. v2 q5 N| 欢迎光临 爱吱声 (http://129.226.69.186/bbs/) | Powered by Discuz! X3.2 |