Nvidia 和 AMD 硬件上的 OpenCL FFT?
Posted
技术标签:
【中文标题】Nvidia 和 AMD 硬件上的 OpenCL FFT?【英文标题】:OpenCL FFT on both Nvidia and AMD hardware? 【发布时间】:2012-07-03 11:49:35 【问题描述】:我正在开展一个需要在 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,我会更喜欢它。
【问题讨论】:
ViennaCL 现在包含“实验性”FFT 实现。至少对于 2 次幂变换,它应该合理地执行。 【参考方案1】:NVIDIA 没有做任何工作来支持 OpenCL 库,例如 FFT。它也没有为其 CUDA 库提供源代码,因此无法使用 OpenCL 运行这些库。
AMD 的 FFT 库是您的最佳选择,它可以在任何其他兼容 OpenCL 的设备上运行,包括 NVIDIA 的 GPU。 ArrayFire OpenCL 利用 AMD 的 FFT 库,我已经在我们实验室的 Intel、NVIDIA 和 AMD 设备上运行了它。
【讨论】:
【参考方案2】:除了 Ben 的 AMD 建议之外,您还可以研究 Apple FFT 示例代码。但是,他们的代码仅在 GPU 设备上运行,因为它会检查所提供的命令队列是为哪些设备类型创建的。
【讨论】:
【参考方案3】:SHOC benchmark on github 还包括我在 nvidia GPU 650M、intel gpu 和 intel CPU 上为 FFT 测试过的代码。在 Windows 上,创建一个项目并设置包含和链接路径需要几分钟,但这很简单。在 intel gpu 上运行需要设置命令行选项或进行少量代码修改,因为 intel gpu 是设备 1 而不是设备 0,这是 shoc 基准测试套件中的默认设置。
我没有验证输出的正确性,只是编译并运行完成。
【讨论】:
以上是关于Nvidia 和 AMD 硬件上的 OpenCL FFT?的主要内容,如果未能解决你的问题,请参考以下文章
在 64 位 Ubuntu 14.04 中使用 Nvidia *和* AMD GPU 进行 OpenCL 开发