最终用户运行OpenCL应用程序需要哪些可再发行组件?

时间:2014-02-10 02:50:36

标签: opencl nvidia ati

我在基于NVidia的OpenCL架构上开发了一个C ++应用程序,并希望将其分发给最终用户。

不幸的是,带有ATI卡的用户似乎无法运行我的游戏,因为包含我的OpenCL代码的dll甚至无法加载(动态),而使用NVidia驱动程序的用户似乎可以加载我的dll。

在发布“随处运行”的基于OpenCL的应用程序时,推荐的“最佳做法”是什么?应用程序提供商是否可以插入所有允许所有用户使用该应用程序的dll,或者来自不同OpenCL架构的用户是否被迫下载该体系结构的OpenCL SDK?

非常感谢!

编辑:奇怪的是,通过在我的构建中添加NVCuda.dll来解决丢失的dll依赖关系。 (想要删除它!)但是,这里提供的答案对于构建可在大多数平台上运行的OpenCL应用程序的“最佳实践”非常有用...

3 个答案:

答案 0 :(得分:2)

他们需要GPU驱动程序。对于Intel CPU,他们可以手动下载必要的二进制文件。

AMD设备编译器的编译操作需要一些时间,而Nvidia可以快速编译。当您定位CPU时,编译时间非常短。我将基本的C ++流体和光线跟踪器模拟转换为opencl版本,并在3分钟后编译!(我的意思是设备opencl-c编译内核)如果你想给人们一个已编译的项目,那么你需要拥有每一个您访问时的卡类型,并为所有这些卡编译和保存二进制文件。

某些gl-cl-dx共享操作在供应商之间可能不兼容。

不要使用特定于平台的常量,它们可能无法在其他平台上完全映射。

告诉人们您的目标opencl版本。

不要使用大于256的本地工作组大小进行GPU计算。 AMD GPU的最大本地工作组大小为256,而Nvidia为1024.

如果你需要它,请不要泄漏私有寄存器,减少伪递归函数的深度。有时,AMD编译器会尝试进行优化,以至于在本机设备编译时会爆炸。

使用您自己的“平台和设备查询包装器”找到合适的gpu,不要只获得平台[0]或设备[0]。用户可能拥有多个平台,例如Intel的CPU和AMD的GPU,也许都是GPU。 APU包含的GPU可能被称为ACC而不是GPU(我不确定)

内核和缓冲区传输的隐式同步可以在您的系统上成功运行,而不能在其他系统上运行。

检查你的dll或app是否与其他人的机器和操作系统相同。如果您的目标是64位并且它们具有32位操作系统,则它将无法工作。

答案 1 :(得分:0)

AMD最近的Catalyst驱动程序应该已经提供了OpenCL支持。当然,如果某人有没有OpenCL支持和/或没有安装最新驱动程序的旧卡,它可能会回退到CPU-OpenCL,或者它可能根本不起作用。我不确定您可以做出哪些假设(关于您为程序声明的系统要求),但至少在目标系统具有最新驱动程序时不需要自己的专用“可再发行组件”。

答案 2 :(得分:0)

你应该这样做:

  1. 使用动态“OpenCL.dll / so”加载,这样您的用户根本不需要使用OpenCL。 (可选,但非常有用,您甚至可以回退到CPU模式。此外,它将强制您仅使用纯OpenCL调用)
  2. 仅使用常见的OpenCL方法,不要使用依赖于其他DLL的公司调优方法。例如,nVIDIA在OpenCL库中有很多工具,迫使你将它与nVIDIA库和驱动程序一起使用。例如,这些调用以oclXXX()开头。
  3. 以通用方式编写内核和代码,不要指望每个人都有相同的工作大小,内存等。您应该能够检测情况,并使内核适应这些事实。使用内核编译,并添加#defines来控制内核中的行为。然后,您可以通过设置硬件检测到的功能从外部定义它们。 (只有当你真的不关心你的代码安全性时。
  4. 回答你的问题:

    • 如果需要,您需要重新分发您使用的供应商提供的DLL(即:nVIDIA)客户端必须启用正确的OpenCL,即使它来自其他制造商也应该有效。
    • 最佳做法是使用干净的(非供应商相关的)OpenCL代码,因此不要强制客户端安装任何特定的库。而且您无需安装或随应用程序一起分发它。