运行OpenCL应用程序需要终端用户提供哪些可再发行功能? 我在基于NVIDIA的OpenCL架构上开发了一个C++应用程序,希望将其分发给最终用户。
不幸的是,使用ATI卡的用户似乎无法运行我的游戏,因为包含我的OpenCL代码的dll甚至无法加载(动态),而使用NVidia驱动程序的用户似乎可以加载我的dll 在发布基于OpenCL的应用程序时,推荐的“最佳实践”是什么?应用程序提供商是否可以插入所有允许所有用户使用应用程序的DLL,或者来自不同OpenCL体系结构的用户是否被迫下载该体系结构的OpenCL SDK 非常感谢运行OpenCL应用程序需要终端用户提供哪些可再发行功能? 我在基于NVIDIA的OpenCL架构上开发了一个C++应用程序,希望将其分发给最终用户。,opencl,nvidia,ati,Opencl,Nvidia,Ati,不幸的是,使用ATI卡的用户似乎无法运行我的游戏,因为包含我的OpenCL代码的dll甚至无法加载(动态),而使用NVidia驱动程序的用户似乎可以加载我的dll 在发布基于OpenCL的应用程序时,推荐的“最佳实践”是什么?应用程序提供商是否可以插入所有允许所有用户使用应用程序的DLL,或者来自不同OpenCL体系结构的用户是否被迫下载该体系结构的OpenCL SDK 非常感谢 编辑:奇怪的是,通过将NVCuda.dll添加到我的构建中,缺少的dll依赖项得到了解决。(想删除它!)但是,这里提
编辑:奇怪的是,通过将NVCuda.dll添加到我的构建中,缺少的dll依赖项得到了解决。(想删除它!)但是,这里提供的答案对于构建能够在大多数平台上运行的OpenCL应用程序的“最佳实践”非常有用…他们需要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]。用户可能有多个平台,比如英特尔的CPU平台和AMD的GPU平台,可能所有平台都有。APU包含的GPU可能被称为ACC而不是GPU(我对此不确定) 内核和缓冲区传输的隐式同步可以在您的系统上成功运行,而不能在其他系统上运行
检查您的DLL或应用程序是否与其他人的机器和操作系统相同。如果您的目标是64位,而他们有32位操作系统,那么它将无法工作 AMD最近推出的Catalyst驱动程序应该已经提供了OpenCL支持。当然,当有人有一张没有OpenCL支持的旧卡和/或没有安装最新的驱动程序时,它可能会退回到CPU OpenCL,或者可能根本不起作用。我不确定您可以做出哪些假设(关于您为您的程序声明的系统需求),但当目标系统具有最新的驱动程序时,至少不需要自己的专用“可再发行文件” 您应该这样做:
oclXXX()
开头#defines
。然后,您可以通过设置硬件检测功能从外部定义它们。(仅当您不真正关心代码安全性时- 如果需要,您需要重新分发来自您使用的供应商(即:nVIDIA)的DLL。客户端必须启用适当的OpenCL,即使它来自其他制造商,也应该可以工作
- 最佳实践是使用干净的(与供应商无关的)OpenCL代码,这样您就不必强制客户端安装任何特定的库,也不需要在应用程序中安装或分发它