【问题标题】:Distributing an OpenCL Software分发 OpenCL 软件
【发布时间】:2016-07-20 16:00:25
【问题描述】:

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

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

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

任何帮助将不胜感激!

亲切的问候。

【问题讨论】:

    标签: components opencl software-distribution


    【解决方案1】:

    OpenCL 供应商库现在是每个 GPU 供应商的图形驱动程序包的一部分。他们还在安装图形驱动程序时安装和注册通用 OpenCL.dll,因此您不必分发 OpenCL 或其供应商库。

    这适用于 AMD/ATI、nVidia 和 Intel GPU。但可能不适用于其他 GPU 供应商。不幸的是,这仅适用于相当新的 GPU 和最近的驱动程序,比如说过去 12-18 个月。您必须调查以下情况:

    1. Windows 可以使用通用驱动程序运行 GPU,并且未安装供应商特定的驱动程序
    2. 驱动已过时多年,未安装新驱动
    3. 没有新的驱动程序
    4. GPU 不支持 OpenCL

    在所有情况下,用户都必须安装最新的 GPU 驱动程序,或者如果没有可用的驱动程序,那么通常 OpenCL 无论如何都不可用。这是必须通过某些安装程序逻辑/交互来完成的场景。

    还有两个问题。首先,如果要将带有 SIMD (SSE2/AVX) 的 CPU 用作 OpenCL 平台,则必须手动安装 Intel CPU(带有 C)OpenCL 包。此任务类似于安装 GPU 驱动程序,并且还必须通过一些安装程序逻辑来处理这种情况。我不鼓励分发 Intel 的供应商 DLL,并建议 Intel 提供适当的 OpenCL CPU 包安装程序。

    第二个问题是,如果任何供应商或驱动程序包都没有安装 OpenCL,那么通常 OpenCL.dll 也会丢失。这个库几乎总是动态链接而不是按需链接(GetProcAddress),因此任何使用 OpenCL 的应用程序都不会加载和停止,并出现 DLL not found 消息框。应用程序甚至没有更改报告或提供帮助。最好的解决方案是使用加载延迟(只需在链接器设置中将 OpenCL.lib 指定为加载延迟),然后在第一个 OpenCL API 之前在应用程序中执行通用 is-dll-installed-on-system 检查叫。然后提供合理的用户交互和支持。

    此外,所有 3 家市长供应商都有最终用户 OpenCL 分发包。虽然我仍然建议安装最新的驱动程序。

    【讨论】:

      【解决方案2】:

      您的代码将在目标机器上进行 JIT 编译。您需要注意仅在可用设备上分发内核。因此,在运行时,您的内核将仅在那些支持 OpenCL 的设备上执行。当然,这意味着:只有具有 OpenCL 感知设备的机器才能利用您的优化。

      【讨论】:

      • 但是如果这个软件是游戏呢?该软件以动态方式正确映射内核和设备,但如果我的一个用户使用 NVIDIA 而其他用户只使用 AMD?我没有在用户机器上编译它的选项...所以我需要请求用户为他们自己的系统安装驱动程序?
      • 只要硬件支持 OpenCL 就可以了。如果你(或用户)没有松动。您也不希望在 ARM 上运行 Intel 编译的代码,对吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-26
      • 2011-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多