【发布时间】:2016-02-05 01:51:13
【问题描述】:
我正在尝试提高在大型数据集上运行的代码的速度。我需要执行函数out = sinc(x),其中x 是一个2048-by-37499 的双精度矩阵。这非常昂贵并且是我的程序的瓶颈(即使在 GPU 上计算时也是如此)。
我正在寻找任何可以提高此操作速度的解决方案。
我希望这可以通过预先计算一个向量LookUp = sinc(y) 来实现,其中y 是向量y = min(min(x)):dy:max(max(x)),即一个跨越整个预期x 元素范围的向量。
如何从这个LookUp 向量有效地生成sinc(x) 的近似值?
我需要避免生成一个 3 维数组,因为这会消耗比我可用的内存更多的内存。
这是对 interp1 解决方案的测试:
a = -15;
b = 15;
rands = (b-a).*rand(1024,37499) + a;
sincx = -15:0.000005:15;
sincy = sinc(sincx);
tic
res1 = interp1(sincx,sincy,rands);
toc
tic
res2 = sinc(rands);
toc'
sincx = gpuArray(sincx);
sincy = gpuArray(sincy);
r = gpuArray(rands);
tic
r = interp1(sincx,sincy,r);
toc
r = gpuArray(rands);
tic
r = sinc(r);
toc
经过的时间是 0.426091 秒。
经过的时间是 0.472551 秒。
经过的时间是 0.004311 秒。
经过的时间是 0.130904 秒。
分别对应CPU interp1、CPU sinc、GPU interp1、GPU sinc
【问题讨论】:
-
我认为可以使用
interp1解决这个问题,但评估interp1实际上比sinc慢 -
您能提供一个示例输入供我们使用吗?
-
你的矩阵
x中会有零吗? -
截断泰勒近似值怎么样?可能会更快:wolframalpha.com/input/?i=sinc+taylor+approximation
-
@B.Thomas : interp1 代码最大逼近误差高达 28% ..