CUDA:CUDA中的一维三次样条插值

时间:2012-06-02 02:19:56

标签: cuda interpolation cubic

我正在制作医疗成像设备。我想用CUDA制作更快的设备

我从CCD接收1024次大小的1d数据。 在我执行IFFT之前 我必须应用高性能插值算法(如三次样条插值) 每个1024个大小的数据(然后1d插值512次)。

  1. 是否有任何CUDA库可以执行三次样条插值? (我发现有一个库,但它是2或3维图像。 由于我需要执行其他复杂的过滤功能,我需要全局内存上的数据,而不是纹理内存上的数据。)

  2. 是否有任何NUFFT(非均匀快速傅立叶变换)库(不需要为CUDA编写)? 我想如果我有NUFFT功能,我不需要单独进行插值和IFFT,这样可以制作更快的设备。

4 个答案:

答案 0 :(得分:3)

由于越来越多的人问过这个问题,我也扩展了我的CUDA三次插值代码和一维三次插值。您可以在此处找到更新的代码:http://www.dannyruijters.nl/cubicinterpolation/

还可以在CI.zip的examples子目录中的cudaAccuracyTest示例中找到包含1D立方插值的工作CUDA示例。

对于那些对SSE方法更感兴趣的人,我在examples子目录的referenceCubicTexture3D示例中有一些SSE优化的多线程三次插值代码(尽管是3D,而不是1D)。

编辑:立方插值代码现在可在github上使用。 1D立方插值代码为here

答案 1 :(得分:1)

关于#1

Ruijters的bi / tricubic样条插值,我认为你所引用的http://dannyruijters.nl/cubicinterpolation,(已编辑!)现在适用于1D数据,谢谢!请参阅Danny Ruijters在此页面上的回答。

关于#2

以下是我所了解的一些NUFFT实现,以及对它们的简要介绍。

  1. @ ardiyu07提到的第一个图书馆,Greengard,等人的快速高斯网格化的实现,是在Fortran,我不知道,所以我没有长时间看这个(尽管这确实提供了III型)非均匀到非均匀变换)。
  2. 第二个是Ferrara在Matlab / MEX中实现Greengard的算法,我无法让它给我正确的解决方案(请参阅我刚发布的关于Mathworks FileExchange效果的评论)。
  3. Potts,et al。,http://www-user.tu-chemnitz.de/~potts/nfft/我无法在Windows中编译它,所以我放弃了它。它还有III型NUFFT。
  4. Fessler等人,http://web.eecs.umich.edu/~fessler/code/用Matlab / MEX编写,至少为Linux和Windows提供预编译的二进制文件。绝对是由非专业程序员编写的,但它是我能够正常工作的4个中唯一的一个。我甚至在几个地方更改了他们的Matlab源代码(基本上是通过查看Octave错误被引发的位置)之后才能在GNU Octave中工作,因为Octave可以使用预编译的MEX二进制文件。这也使用了与Greengard或Potts'不同的算法,基于最小 - 最大标准(其解决方案保证最小化最大DFT误差),但缺少III型NUFFT(仅I型和II型:其中一个域具有要统一)。
  5. 我相信第五次NUFFT /“网格化”实施是由哈格里夫斯等人提出的:http://www-mrsrl.stanford.edu/~brian/gridding/(论文http://dx.doi.org/10.1109/TMI.2005.848376)。它在Matlab / MEX中。按原样,与此前列表中的前四个一样,因为它非常嵌入其MRI背景中。
  6. 这里是第六个实现,在Cython(快速Python)中,具有III型非均匀到非均匀变换和一些其他不错的功能,唉GPL:https://github.com/mrbell/gfft
  7. 我正在以冰川的速度工作,将Fessler的算法移植到Python / Cython,也许是CUDA(“可能”因为只是对标准(CU)FFT进行零填充和线性插值似乎运行得很好)。祝你好运。

答案 2 :(得分:0)

  1. 我不知道那个算法,但是如果你发现你对你的设备的思考速度足够快,那你为什么不把实现从使用纹理内存改为一个简单的数组,也许你使用共享内存可以做更多的加速吗?

  2. 我发现一些用matlab和fortran 77编写:

    http://www.cims.nyu.edu/cmcl/nufft/nufft.html

    http://www.mathworks.com/matlabcentral/fileexchange/25135-nufft-nufft-usffft

答案 3 :(得分:0)

老实说,GPU的并行性似乎有点低。具有SSE优化的6核可能在这里胜过GPU。