分发OpenCL软件

时间:2016-07-20 16:00:25

标签: components opencl software-distribution

我有一个软件在核心上使用OpenCL进行优化,一切运行正常,现在我将这个软件打包安装在其他机器上。

现在,我很困惑,例如,在构建软件的机器上,有一个CPU和两个GPU,软件可以检测OpenCL初始化返回的所有设备......所以。 ..i需要为所有不同的供应商分发所有OpenCL Dll和库吗?

此处的任何人都知道分发使用系统类型的软件的最佳方式是什么?

非常感谢任何帮助!

亲切的问候。

2 个答案:

答案 0 :(得分:2)

OpenCL供应商库现在是每个GPU供应商的图形驱动程序包的一部分。他们还在安装图形驱动程序时安装并注册公共OpenCL.dll,这样您就不必分发OpenCL或其供应商库。

适用于AMD / ATI,nVidia和Intel GPU。但可能无法与其他GPU供应商合作。不幸的是,这只适用于合理的新GPU和最近的驱动程序,让我们说最近12-18个月。您必须调查以下方案:

  1. Windows可以使用通用驱动程序运行GPU,而不安装任何特定于供应商的驱动程序
  2. 驱动程序已过时多年且未安装新驱动程序
  3. 没有新的驱动程序
  4. GPU不支持OpenCL
  5. 在所有情况下,用户都必须安装最新的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感知设备的计算机才能利用您的优化。