我在基于NVidia的OpenCL架构上开发了一个C ++应用程序,并希望将其分发给最终用户。
不幸的是,带有ATI卡的用户似乎无法运行我的游戏,因为包含我的OpenCL代码的dll甚至无法加载(动态),而使用NVidia驱动程序的用户似乎可以加载我的dll。
在发布“随处运行”的基于OpenCL的应用程序时,推荐的“最佳做法”是什么?应用程序提供商是否可以插入所有允许所有用户使用该应用程序的dll,或者来自不同OpenCL架构的用户是否被迫下载该体系结构的OpenCL SDK?
非常感谢!
编辑:奇怪的是,通过在我的构建中添加NVCuda.dll来解决丢失的dll依赖关系。 (想要删除它!)但是,这里提供的答案对于构建可在大多数平台上运行的OpenCL应用程序的“最佳实践”非常有用...答案 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)
你应该这样做:
oclXXX()
开头。#defines
来控制内核中的行为。然后,您可以通过设置硬件检测到的功能从外部定义它们。 (只有当你真的不关心你的代码安全性时。回答你的问题: