【问题标题】:Distribution of an application that uses OpenCL分发使用 OpenCL 的应用程序
【发布时间】:2017-12-19 17:40:15
【问题描述】:

我想分发一个使用 openCL 的 Windows/Linux 应用程序,但我找不到最好的方法。

目前我的问题只在 Windows 上:

1- 我使用的是 Intel CPU,如何管理 Intel 和 AMD(最终用户的 CPU)?

2- 对于使用 Visual Studio DLL 的应用程序的分发,我们有 Visual Studio Redistributable 来轻松管理它并避免大量安装 Visual Studio。 openCL 有这样的包吗?

3- 最后,我不知道我是否必须提供OpenCL.dll(不同观点的例子here

我在网上阅读了几个关于这个问题的主题,但没有明确的解决方案。

感谢您的帮助。

【问题讨论】:

  • OpenCL 关心的不是 CPU 的 ISA,而是 GPU 的。通常,所有 Intel (IA-64) 和 AMD (AMD64) 用户只需要一个 x64 版本。如果您实际上已经在具有不同编译器和优化选项的不同处理器上分析了您的代码并发现了证明它合理的性能差异,则仅分发两个(或更多)二进制文件。
  • 好吧,这可以解释为什么我没有找到关于这个主题的信息,这只是一个误会。所以我认为在我的应用程序中提供 OpenCL.dll 没有问题?
  • @Dai:IA-64 是安腾。 x86-64 在英特尔的手册中有时称为 IA-32e。库确实需要在 CPU 上运行以向 GPU 发送指令,因此它们确实需要匹配 CPU 的 ISA。例如,AArch64 OpenCL 库无法在 x86-64 上运行。关键是无论您使用的是 Intel 还是 AMD CPU,x86-64 仍然是 x86-64。它们都实现了相同的架构,有时具有不同的扩展或性能。
  • 不,包中不需要 opencl.dll。程序通过驱动程序自动使用/找到它。为什么选择 Visual Studio DLL?仅查询 cpu 设备的 opencl,以查找用户的 cpu。
  • @PeterCordes 是的,我并不是说为 ARM 构建的 opencl.dll 可以在 x86 机器上运行

标签: windows opencl intel amd


【解决方案1】:

1) 您写入 OpenCL API,它可以与您的用户拥有的任何硬件一起使用。使用您想要支持的较低版本的标头(例如,如果您想针对 1.1 或更高版本,请使用 1.1 中的 cl.h)。

2) 当用户安装图形驱动程序时,OpenCL 运行时会安装在用户的机器上。您不需要(也不应该)重新分发任何东西。

3) 请不要重新分发 OpenCL.dll

您可能需要处理的一个问题是,如果您的用户没有在他们的机器上安装任何 OpenCL。在这种情况下,对 clGetPlatformIDs 的调用将失败。有多种方法可以解决这个问题,所有平台都是特定的。动态链接到 OpenCL.dll 是一种方法,或者运行辅助进程来测试 OpenCL 是另一种方法。在 Windows 上一个优雅的解决方案是延迟加载 OpenCL.dll 并在后期绑定失败时挂钩该 API 以返回 0。

【讨论】:

  • 好的。我不明白你最后的评论,如果用户安装显卡驱动程序时安装了 OpenCL 运行时,这意味着每个人都会在他们的现代机器上安装 OpenCL,所以理论上他们不会有问题,不是吗?
  • 在Windows上,没有GPU驱动还是有可能的,Windows自带的“Basic Graphics”驱动没有OpenCL。
【解决方案2】:

1- 我使用的是 Intel CPU,如何管理 Intel 和 AMD(最终用户的 CPU)

您是在谈论在 CPU 上运行 OpenCL 内核,还是在内核在 GPU 上运行时只是主机端代码?因为如果前者(在 CPU 上),您的用户将需要安装他们各自的 OpenCL CPU 实现,IIRC Intel CPU 实现不能在 AMD 上运行(或者至少以前是这种情况,也许现在不同了..)

3- 最后不知道是不是一定要提供OpenCL.dll

您不必这样做,但应该这样做,IMO。 OpenCL 的工作方式(通常),OpenCL.dll 只是一个 ICD 加载器 - 一个小型库(几十 KB),它通过查看一些预定义的位置来加载实际的 OpenCL 实现。在 Windows 上包含它应该是安全的,并且它简化了您的程序逻辑 - 您始终可以在启用 OpenCL 的情况下构建,如果没有安装 OpenCL 实现,加载程序将返回 CL_PLATFORM_NOT_FOUND_KHR - 您只需通过要求用户安装 OpenCL 来处理该错误实现,或回退到非 OpenCL 代码路径(如果有),更适合您。

没有必要因为延迟加载 DLL 或辅助进程而使您的生活变得复杂。事实上,这就是 ICD 概念的全部要点——您不需要自己寻找平台和 DLL,您可以让 ICD 加载器来完成。编写帮助程序代码来加载帮助程序库(ICD)然后加载实际的实现 DLL 是非常荒谬的......

【讨论】:

  • 如果您发布 OpenCL.dll,这不会影响用户安装 OpenCL 设置,该设置使用最新的 CPU 驱动程序,或针对其 CPU 的优化版本?
  • 目前内核仅在 CPU(而非 GPU)上启动。好的,所以如果我理解,对于 GPU,OpenCL 实现与驱动程序一起安装,但与 CPU 驱动程序不同。就我而言,如果用户以前没有使用过 OpenCL,我会遇到问题。您说“您只是通过要求用户安装 OpenCL 实现来处理该错误”,这意味着用户必须安装完整的 Intel SDK(例如,如果是 Intel CPU)?
  • @GoblE 是的,对于 CPU,您需要一个 CPU 实现。如果您考虑英特尔、AFAICT,您不需要整个 SDK,只需要 CPU 运行时 - 所以基本上是“英特尔酷睿和英特尔至强处理器的 OpenCL 运行时”from this link。同样从我在他们的许可证中读到的内容,只要您的用户同意许可证at least as restrictive as the one provided by Intel,您就可以分发它。如果它适用于 AMD,这可能是最好的..
  • @PeterCordes 我相信它不应该,因为驱动程序提供的 OpenCL.dll 也只是一个 ICD - 任何 ICD(如果它不是太旧的话)应该能够加载任何驱动程序。具有实际实现的 DLL 写在注册表中,在“HKLM\SOFTWARE\Khronos\OpenCL\Vendors”中 - 这是 ICD (OpenCL.dll) 查找它们的地方。
猜你喜欢
  • 2017-06-01
  • 2011-01-19
  • 2014-04-01
  • 1970-01-01
  • 2012-03-29
  • 1970-01-01
  • 2018-07-15
  • 2014-02-01
  • 2015-08-20
相关资源
最近更新 更多