我正在开发一个需要在Nvidia和AMD显卡上使用FFT的项目。我最初寻找一个可以同时工作的库(认为这将是OpenCL方式),但我没有运气。
有人向我建议我必须使用每个供应商的FFT实现并编写一个选择基于平台做什么的包装器。我很容易发现AMD的实现,但实际上我正在使用Nvidia卡(这对我的特定应用来说更重要)。
我能找到的唯一Nvidia实现是CUFFT实现。有谁知道我如何实际使用OpenCL的CUFFT库?我能想到的唯一方法就是在我的OpenCL代码旁边加上一些CUDA代码。我已经读过,我不能只使用OpenCL缓冲区作为CUDA指针(Trying to mix in OpenCL with CUDA in NVIDIA's SDK template)。相反,我是否必须在运行OpenCL内核后将缓冲区复制回主机,然后使用CUDA内存传输例程将它们复制回GPU?我真的不喜欢这种方法,因为它似乎涉及无意义的内存传输,如果我可以使用OpenCL中的CUFFT,我会更喜欢它。
答案 0 :(得分:6)
NVIDIA还没有做任何支持OpenCL库的工作,比如FFT。它还没有为其CUDA库提供源代码,因此无法使用OpenCL运行它们。
AMD的FFT库是您最好的选择,它将运行在任何其他OpenCL兼容设备上,包括NVIDIA的GPU。 ArrayFire OpenCL利用了AMD的FFT库,我在我们的实验室中运行了英特尔,NVIDIA和AMD设备。
答案 1 :(得分:1)
除了Ben的AMD建议之外,您还可以调查Apple FFT示例代码。但是,它们的代码仅在GPU设备上运行,因为它检查为所创建的命令队列创建的设备类型。
答案 2 :(得分:0)
SHOC benchmark on github还包括我在nvidia GPU 650M,intel gpu和用于FFT的intel CPU上测试过的代码。在Windows上,创建项目并设置包含和链接路径需要几分钟,但这很简单。在intel gpu上运行需要设置命令行选项或小代码修改,因为intel gpu是设备1而不是设备0,这是shoc基准测试套件中的默认设置。
我没有验证输出的正确性,只是它编译并运行完成。