我有一个软件在核心上使用OpenCL进行优化,一切运行正常,现在我将这个软件打包安装在其他机器上。
现在,我很困惑,例如,在构建软件的机器上,有一个CPU和两个GPU,软件可以检测OpenCL初始化返回的所有设备......所以。 ..i需要为所有不同的供应商分发所有OpenCL Dll和库吗?
此处的任何人都知道分发使用系统类型的软件的最佳方式是什么?
非常感谢任何帮助!
亲切的问候。
答案 0 :(得分:2)
OpenCL供应商库现在是每个GPU供应商的图形驱动程序包的一部分。他们还在安装图形驱动程序时安装并注册公共OpenCL.dll,这样您就不必分发OpenCL或其供应商库。
适用于AMD / ATI,nVidia和Intel GPU。但可能无法与其他GPU供应商合作。不幸的是,这只适用于合理的新GPU和最近的驱动程序,让我们说最近12-18个月。您必须调查以下方案:
在所有情况下,用户都必须安装最新的GPU驱动程序,或者如果没有,则通常无法使用OpenCL。这是一个必须由某些安装程序逻辑/交互完成的场景。
还有两个问题。首先,如果要将具有SIMD(SSE2 / AVX)的CPU用作OpenCL平台,则必须手动安装Intel CPU(带有C)OpenCL软件包。此任务类似于安装GPU驱动程序,此方案也必须由某些安装程序逻辑处理。我不鼓励从英特尔发布供应商DLL,并建议英特尔提供正确的OpenCL CPU软件包安装程序。
第二个问题是,如果任何供应商或驱动程序包都没有安装OpenCL,那么通常也会丢失OpenCL.dll。几乎总是这个库是动态链接而不是按需(GetProcAddress),所以使用OpenCL的任何应用程序都不会加载和停止DLL未找到消息框。申请报告或提供帮助甚至没有变化。对此最好的解决方案是使用load-delay(只需在链接器设置中指定OpenCL.lib作为加载延迟),然后在第一个OpenCL API之前在应用程序中执行通用的is-dll-installed-on-system检查。调用。然后提供合理的用户交互和支持。
此外,所有3位市长供应商都拥有最终用户OpenCL分发包。虽然我仍然建议安装最新的驱动程序。
答案 1 :(得分:0)
您的代码将在目标计算机上编译JIT。您需要注意仅在可用设备上调度内核。因此,在运行时,您的内核将仅在支持OpenCL的设备上执行。当然,这意味着:只有具有OpenCL感知设备的计算机才能利用您的优化。