数值分析 发表于 2022-9-24 23:04
拉下来?拉多少?' m. b% @3 J! t8 H
把代码贴上来看看?
风雨无阻 发表于 2022-9-24 23:335 V: y3 m/ n3 p# h9 U2 H3 p/ L
Maybe Debug mode?
雷达 发表于 2022-9-24 23:54- `0 C. G! J& _; u6 S/ z9 g% c* D! ?$ G
void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)+ z V- m. x4 j* K2 m
{. c3 y4 { C# n+ m T
comp temp, xtimesy;
数值分析 发表于 2022-9-25 00:20, m8 y3 A! x7 G3 S1 V2 z
这个不是这么比的吧。。。& g( ~( W, _ X% i7 \
6 b2 m6 v0 @6 K7 K+ O' ?0 c+ _* n
您这个函数,不带内循环的话,汇编完总共操作也没几个(不到100个)。
雷达 发表于 2022-9-25 00:46
有道理。
所以存在内循环速度就上不去,把内循环取消,改成两个向量直接点乘再求和应该就会好得多,这大 ...
数值分析 发表于 2022-9-25 00:20, s {8 ?* A' B% N3 M" n2 `; R2 m7 r
这个不是这么比的吧。。。
) \# V1 J) `+ ~ D( g1 U/ f2 Z
您这个函数,不带内循环的话,汇编完总共操作也没几个(不到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
又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
雷达 发表于 2022-9-25 04:47
又写了个小实验,没有调用子函数,双层循环,外层6千次,内循环30万次空转,有或没有空转内循环,时间差 ...
数值分析 发表于 2022-9-25 14:582 y, t! g* P/ {0 s0 y1 @. G
能不能把这个也贴上来,看看和上一个有什么不同?
std::vector < float > vec1(N);
std::vector < float > vec2(N);- y9 C2 Y S+ E' V9 i+ X+ Z A
float* b1 = new float[N];
float* b2 = new float[N];
E$ x& D/ O; T4 |! {
for (int j = 0; j < 6000; j++)! R4 n* A7 ?3 s5 B% f- P
{
std::generate(vec1.begin(), vec1.end(), []() {
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 23.23));;
});
5 R6 W" G) k3 h
std::generate(vec2.begin(), vec2.end(), []() {
return static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 24.31));;* e/ W- O; K! z/ V: b5 S
});
for (size_t jj = 0; jj < vec1.size(); jj++)
{
b1[jj] = vec1[jj];
}
0 T# l$ ?7 i/ q' K; |4 ?
for (size_t jj = 0; jj < vec2.size(); jj++)
{
b2[jj] = vec2[jj];7 C% E5 W, u% b6 k% W/ o/ ^6 U
}) `# G7 k* ~& T& Y& X
//Method - 1 N=100000 247s " ?/ g& E, |2 x, q6 C1 d
//fresult = inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0);
//Method - 2 N=100000 237s
/*
for (int jj = 0; jj < N ; jj++). D' d( d- b' S A* H
{6 z8 z: a% r; ~, y
fresult += vec1[jj] * vec2[jj];* p% N [2 @8 U
}
*/
//Method - 3 N=100000 204s
/*
for (int jj = 0; jj < N; jj++)$ G' R: {1 T7 E# X6 `( u& Y# m
{
fresult += b1[jj] * b2[jj];
}
*/
+ D, m P1 Q. D( }- w; i ]
//Method - 4 202s& [' i/ m5 D0 u2 ]9 b6 w# H
/*% \2 O, P+ [ D" X; [
for (int jj = 0; jj < N; jj++)" C2 w# b4 S& ^& w
{
4 ?4 K& r# Y E: d
}
*/' E4 v# m( b/ p3 x9 G
//comment out all methods, N=100000 202s
}
delete []b1;' q4 m" F/ G8 Z0 M: [6 I" J z+ o& h2 P
delete []b2;
机器猫 发表于 2022-9-27 00:15
瞎猜一下啊。把第一个的那个j定义成register变量会不会有不同?2 x0 J, N1 Y E/ T) @
; V+ P$ d! @! k/ @
你第二个试验里面的j在循环里面又重新定义 ...
雷达 发表于 2022-9-27 01:16
内循环里面的 j 实际是 i, 为了规避爱坛显示的冲突帖子里临时改成了j, 现在是 jj 了。好累 、LOL
不和它 ...
) a/ c/ n# C' M雷达 发表于 2022-9-24 23:54
void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
{
comp temp, xtimesy;
雷达 发表于 2022-9-26 01:30: R5 s e1 w2 ^8 W# } p, [& g3 Q
理了理思路,重新做了一个测试。* x, ]+ N ~' z1 W# u* @6 W3 P; L+ }; n
做了两个 vector 和 两个 float *, 都长 100000, m0 }: u* c% [# R- k, m
外循环 6000,里面先做随 ...
雷声 发表于 2022-9-27 20:39* f' K- W4 {) C! [8 b* ?
这个时间是从哪里开始算的?
我怀疑这个200多秒里面有200秒花在产生随机数上了,真正计算大概只用了2秒, ...
雷达 发表于 2022-9-24 23:54
void xcorr(comp* outcomp, comp* A, int lenA, comp* B, int lenB)
{8 t& s4 |) |; `' [& Y% I ?
comp temp, xtimesy;
opensrc 发表于 2022-9-28 00:292 Q* w8 q. a3 w
我有些迷糊,这样的code,难道不就应该时间差很多吗?也做了个简单的实验,你看看我做的有错吗
...
。* u* O3 Z3 ]8 S7 q7 K5 C) J

; L+ m8 u( ?) ?9 F2 l| 欢迎光临 爱吱声 (http://129.226.69.186/bbs/) | Powered by Discuz! X3.2 |