运行OpenCL应用程序需要终端用户提供哪些可再发行功能? 我在基于NVIDIA的OpenCL架构上开发了一个C++应用程序,希望将其分发给最终用户。

运行OpenCL应用程序需要终端用户提供哪些可再发行功能? 我在基于NVIDIA的OpenCL架构上开发了一个C++应用程序,希望将其分发给最终用户。,opencl,nvidia,ati,Opencl,Nvidia,Ati,不幸的是,使用ATI卡的用户似乎无法运行我的游戏,因为包含我的OpenCL代码的dll甚至无法加载(动态),而使用NVidia驱动程序的用户似乎可以加载我的dll 在发布基于OpenCL的应用程序时,推荐的“最佳实践”是什么?应用程序提供商是否可以插入所有允许所有用户使用应用程序的DLL,或者来自不同OpenCL体系结构的用户是否被迫下载该体系结构的OpenCL SDK 非常感谢 编辑:奇怪的是,通过将NVCuda.dll添加到我的构建中,缺少的dll依赖项得到了解决。(想删除它!)但是,这里提

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

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

非常感谢


编辑:奇怪的是,通过将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,或者可能根本不起作用。我不确定您可以做出哪些假设(关于您为您的程序声明的系统需求),但当目标系统具有最新的驱动程序时,至少不需要自己的专用“可再发行文件”

您应该这样做:

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

    • 如果需要,您需要重新分发来自您使用的供应商(即:nVIDIA)的DLL。客户端必须启用适当的OpenCL,即使它来自其他制造商,也应该可以工作
    • 最佳实践是使用干净的(与供应商无关的)OpenCL代码,这样您就不必强制客户端安装任何特定的库,也不需要在应用程序中安装或分发它

    非常感谢huseyin提供的宝贵信息。看起来,我在NVdia构建中使用的1024,正如您所说,必须减少到256,这将是一个痛苦的变化!因此,如果我正确理解您的意思,那么我的用户无论是使用像样的NVidia卡还是AMD卡,都可以在使用英特尔CPU的情况下完成所有需要编译的内容需要下载,而最终只有AMD CPU的用户拥有编译所需的一切?看来我选择的参数(如工作组大小=1024)会困扰我……有人看到过一个“安全设置”列表吗?假设一张像样的AMD或NVidia卡使用不到3年,那么它应该在最像样的PC游戏机平台上运行?谢谢你,妈妈rco13对于那篇有用的文章。我将不得不调整到平台更合适的位置…只是因为我使用的“前缀和”算法不再适用于AMD平台,我必须找到另一个alg来使用!非常感谢DarkZeros的有用文章。关于你的观点#2关于不使用oclXXX()调用,查看我的代码,我看到了诸如oclGetPlatformID()、oclLoadProgSource()、oclPrintDevInfo()、oclLogBuildInfo()之类的调用……你是说我的应用程序因为这些调用而不能在AMD卡上运行吗?