数值分析 发表于 2022-9-24 23:044 W8 n' l7 B, L$ G
拉下来?拉多少?
把代码贴上来看看?
风雨无阻 发表于 2022-9-24 23:33. ^- L' b6 G3 ^2 E
Maybe Debug mode?
雷达 发表于 2022-9-24 23:54* Y/ B6 b1 o1 M3 [7 t
void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)" B2 _3 ?# R* z/ w* O7 y. _
{
comp temp, xtimesy;
数值分析 发表于 2022-9-25 00:20
这个不是这么比的吧。。。: \3 b: Q3 G3 ^9 ]
& L" `# [" P. H8 S6 L2 B- P
您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
雷达 发表于 2022-9-25 00:468 ]7 Y' n1 n! |6 r+ Y
有道理。
所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
数值分析 发表于 2022-9-25 00:20) E* f! {6 q8 L7 r- Y: D; y! [
这个不是这么比的吧。。。
您这个函数,不带内循环的话,汇编完总共操作也没几个(不到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+ {/ q2 C8 S& D9 g$ y% M. e
又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
雷达 发表于 2022-9-25 04:473 e& q" Q5 f. m; W4 x6 o
又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
数值分析 发表于 2022-9-25 14:58# L0 T! d7 N: R1 r4 g# W
能不能把这个也贴上来,看看和上一个有什么不同?
std::vector < float > vec1(N);( w( n" m% I/ n4 t3 T1 R: Q
std::vector < float > vec2(N);" s$ ]6 N" S( H- s
float* b1 = new float[N];, Y* Z+ O D' V/ `& m/ a
float* b2 = new float[N];
& C; J |& h( ]2 @) h: t
for (int j = 0; j < 6000; j++)/ u, D7 U$ D X+ m* N3 d0 p1 x
{4 G; ?2 `) k1 p0 w+ l6 Z6 y
std::generate(vec1.begin(), vec1.end(), []() {
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
}); _; @) U& U# v' B1 t9 g
std::generate(vec2.begin(), vec2.end(), []() {
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;+ D& w8 T% d) I& Q( }( {
});2 I& S& W! I4 R' L
for (size_t jj = 0; jj < vec1.size(); jj++)! }* P) _% Y* [- A: f& T" D
{
b1[jj] = vec1[jj];
}. y# B. P. V4 H. j- S% h% C
for (size_t jj = 0; jj < vec2.size(); jj++)
{' B: U0 Y* N, m+ X. l
b2[jj] = vec2[jj];
}
" Z1 j2 j* g5 X2 {; e
//Method - 1 N=100000 247s
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
7 P- z3 ?: ?/ s: ]* i9 B" r$ I
//Method - 2 N=100000 237s
/*
for (int jj = 0; jj < N ; jj++)2 j; B6 P- ?8 K J B z
{' B, p V+ G8 F" ]/ B
fresult += vec1[jj] * vec2[jj];9 p6 y' C2 m7 d- {$ {2 q- w$ \" r
}
*/2 z% u* P$ V; H( B" @9 ~# i
//Method - 3 N=100000 204s
/*5 v: e% X1 i0 h: t* W- Z+ E
for (int jj = 0; jj < N; jj++)- u/ j* X" l$ R8 r/ O9 A5 @3 W
{
fresult += b1[jj] * b2[jj];9 E" V7 N t/ W% u$ k2 q! _
}6 p* K4 l' ?+ I$ j
*/
, o7 z( h1 @& G( X5 u5 v
//Method - 4 202s
/*
for (int jj = 0; jj < N; jj++)
{
# f/ j4 A3 a9 `0 b" F
}
*/, e3 Q' a% Y3 X5 L0 G2 @1 \
//comment out all methods, N=100000 202s - {6 G9 y9 }9 I- U$ \' c
}! p& S% I4 y- _! L5 t
, c6 a$ l" K3 ~ }4 t# {1 N
delete []b1;
delete []b2;
机器猫 发表于 2022-9-27 00:15
瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?6 ]6 q, B/ [1 ^ r+ J/ c
你第二个试验里面的j在循环里面又重新定义 ...
雷达 发表于 2022-9-27 01:16
内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
不和它 ...

雷达 发表于 2022-9-24 23:54: ~6 i" o9 [1 k$ v
void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)0 O M7 ~6 o% D2 v+ L1 e( k- R* h
{
comp temp, xtimesy;
雷达 发表于 2022-9-26 01:30
理了理思路,重新做了一个测试。
做了两个 vector 和 两个 float *, 都长 100000' ?! W5 E" m$ E* x- ~( I
外循环 6000,里面先做随 ...
雷声 发表于 2022-9-27 20:395 l1 P$ d( E% P$ j9 n8 _
这个时间是从哪里开始算的?
我怀疑这个200多秒里面有200秒花在产生随机数上了,真正计算大概只用了2秒, ...
雷达 发表于 2022-9-24 23:54
void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)& u) Z& w7 B7 ^8 o
{
comp temp, xtimesy;
opensrc 发表于 2022-9-28 00:29" ?1 M, [: f7 ? a' }. Y
我有些迷糊,这样的code,难道不就应该时间差很多吗?也做了个简单的实验,你看看我做的有错吗$ e* t4 C- {% \! x
...
。


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