数值分析 发表于 2022-9-24 23:04$ s, p; E* f+ V/ a
拉下来?拉多少?- G2 |4 w ?! l, w% X
把代码贴上来看看?
风雨无阻 发表于 2022-9-24 23:33! c4 ]% S- Y, {; M$ M1 o
Maybe Debug mode?
雷达 发表于 2022-9-24 23:54; W4 Z o* Z/ e2 `, ?
void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)3 \6 z! ^) } n& ^
{
comp temp, xtimesy;
数值分析 发表于 2022-9-25 00:20
这个不是这么比的吧。。。& d( U' ]# H7 q! W+ W
您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
雷达 发表于 2022-9-25 00:467 [. [1 j/ T) Q5 d& S: f {! _
有道理。; R4 J }, v$ y4 q+ N- P
所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
数值分析 发表于 2022-9-25 00:208 Y U- z0 Q; m T8 S
这个不是这么比的吧。。。# G0 g1 }1 I" l2 k; i" B
: @& @' {( X9 J
您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
而加上内循环,光jmp和dec指令就至少多执行了6000个
沉宝 发表于 2022-9-25 01:489 R4 o! F0 J; m% f) [, ^
现在的CPU,可以把判断、jmp和dec指令全部融合进一个µOp(微操作,CPU内部流水线上的执行单位)。如果 ...
沉宝 发表于 2022-9-25 01:27
你两个试验之间就差了一个空循环, call 1000次按理不会有秒级差异,可能还是编译器优化的问题。举个例子 ...
雷达 发表于 2022-9-25 04:478 a$ S! v3 |- U; F; ^. @8 {' N
又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
雷达 发表于 2022-9-25 04:47
又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
数值分析 发表于 2022-9-25 14:58
能不能把这个也贴上来,看看和上一个有什么不同?
std::vector < float > vec1(N);
std::vector < float > vec2(N);% N5 H+ v$ H) K, f' |; p* E0 Y5 g
float* b1 = new float[N];
float* b2 = new float[N];# b- Y1 x6 T$ x1 l! ?
for (int j = 0; j < 6000; j++)
{# g' X; p g+ l3 ?+ b
std::generate(vec1.begin(), vec1.end(), []() {
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;4 w+ z+ }9 C- A+ G/ W2 z# N
});$ L! A5 V' b5 f
std::generate(vec2.begin(), vec2.end(), []() {$ D I- Q n# A9 ~! G
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;
});# B& f8 I: d7 J/ W, I& b5 E
9 G' e3 N2 T( v2 l9 k4 k
for (size_t jj = 0; jj < vec1.size(); jj++)" o, \9 U" \3 d J. s
{
b1[jj] = vec1[jj];
}
; p' b. D+ G# Y7 d+ f( L+ z7 N
for (size_t jj = 0; jj < vec2.size(); jj++)# L' r( J1 I) l$ C
{
b2[jj] = vec2[jj];4 z N$ Q) U' o" d d8 G- q S
}" p" {1 k$ B) c" S* e
//Method - 1 N=100000 247s $ h) w S% | c6 v# G2 v5 m
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);1 W$ a7 T' t, G+ Q4 s
//Method - 2 N=100000 237s+ ]- A7 H) N4 |
/*
for (int jj = 0; jj < N ; jj++)- V' r* W @5 Y$ Z. @7 i( I
{6 y7 F6 G: P L
fresult += vec1[jj] * vec2[jj];6 F1 K; l7 o; V
}+ t5 N2 z5 |' ?9 H5 ]# L& l
*/
//Method - 3 N=100000 204s
/*
for (int jj = 0; jj < N; jj++)2 P( v+ U: b }* j3 h0 _
{/ l! @7 u, x6 W n
fresult += b1[jj] * b2[jj];: ~' Z% i$ I. _
}. p- g* |: a/ N% d
*/% Z7 D0 l* k$ i0 k
//Method - 4 202s, R @9 w$ n& G; c$ }
/*
for (int jj = 0; jj < N; jj++)
{) r0 K g1 t# W3 i8 o& l
; Q9 y8 {- y! W
}
*/
//comment out all methods, N=100000 202s 7 X; Z2 Y6 e1 }2 z
}$ c5 W& o7 e. |" m: S" v, F4 C1 d) s# _
delete []b1;4 O9 I9 G9 }, j- F
delete []b2;
机器猫 发表于 2022-9-27 00:15
瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?
你第二个试验里面的j在循环里面又重新定义 ...
雷达 发表于 2022-9-27 01:16
内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL$ ~. S! H6 V9 \* W% H, u& T
- k7 _- @! o& X' t
不和它 ...

雷达 发表于 2022-9-24 23:544 T r0 }! x' d4 B
void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
{. r4 a( g. y/ Y
comp temp, xtimesy;
雷达 发表于 2022-9-26 01:30" W; X8 @% ?5 p0 V
理了理思路,重新做了一个测试。
做了两个 vector 和 两个 float *, 都长 100000! p q @! F2 o
外循环 6000,里面先做随 ...
雷声 发表于 2022-9-27 20:391 a _, l' P+ S+ q8 |2 L0 {
这个时间是从哪里开始算的?
我怀疑这个200多秒里面有200秒花在产生随机数上了,真正计算大概只用了2秒, ...
雷达 发表于 2022-9-24 23:54& r9 s) g% f& t8 `1 V
void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)/ e+ ?) c+ m) ?
{* ?6 O( ~( U3 [) P. g* ]3 @
comp temp, xtimesy;
opensrc 发表于 2022-9-28 00:29; d/ I9 \# f" I6 p0 Z
我有些迷糊,这样的code,难道不就应该时间差很多吗?也做了个简单的实验,你看看我做的有错吗0 W" I) r5 V a7 z
* x8 s* w! a" z( `
...
。& E0 s) N- V9 G5 l; {: ]


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