Windows 使用OpenCL的应用程序的分发

Windows 使用OpenCL的应用程序的分发,windows,opencl,intel,amd,Windows,Opencl,Intel,Amd,我想发布一个使用openCL的Windows/Linux应用程序,但我找不到最好的方法 目前我的问题仅在Windows上: 1-我正在使用Intel CPU,如何管理Intel和AMD(最终用户的CPU) 2-对于使用VisualStudioDLL的应用程序的分发,我们有VisualStudio可再发行版,以方便地管理它,并避免大规模安装VisualStudio。openCL有这样的软件包吗 3-最后,我不知道是否必须提供OpenCL.dll(不同观点的示例) 我在网上读到几个关于这个问题的话题

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

目前我的问题仅在Windows上:

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

2-对于使用VisualStudioDLL的应用程序的分发,我们有VisualStudio可再发行版,以方便地管理它,并避免大规模安装VisualStudio。openCL有这样的软件包吗

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

我在网上读到几个关于这个问题的话题,但没有明确的解决办法

感谢您的帮助。

1)您可以编写OpenCLAPI,它可以与用户拥有的任何硬件一起工作。用户要支持的较低版本的标题(例如,如果要针对1.1及更高版本,请使用1.1中的cl.h)

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

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

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

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

你说的是在CPU上运行OpenCL内核,还是在GPU上运行内核时只运行主机端代码?因为如果是前者(在CPU上),您的用户将需要安装各自的OpenCL CPU实现,IIRC英特尔CPU实现不在AMD上运行(或者至少过去是这样,也许现在不同了……)

3-最后,我不知道我是否必须提供OpenCL.dll

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


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

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。程序通过驱动程序自动使用/查找它。为什么是VisualStudioDLL?只查询opencl的cpu设备,以查找用户的cpu。@PeterCordes是的,我的意思不是说为ARM构建的
opencl.dll
可以在x86机器上工作。如果您提供了一个opencl.dll,这不会干扰用户安装使用最新驱动程序的opencl安装程序,或者为他们的CPU优化构建?目前内核只在CPU上启动(不在GPU上)。好的,如果我理解的话,对于GPU来说,OpenCL实现是安装了驱动程序的,但它与CPU驱动程序不同。在我的例子中,如果用户以前没有使用过OpenCL,我会遇到一个问题。您说过“您只需通过要求用户安装OpenCL实现来处理该错误”,这意味着用户必须安装完整的英特尔SDK(例如,在英特尔CPU的情况下)?@GoblE是的,对于CPU,您将需要一个CPU实现。如果你考虑英特尔,你不需要整个SDK只是CPU运行时——所以基本上是“英特尔核心和英特尔Xeon处理器的OpenCL运行时”。从我在他们的许可证中读到的内容来看,只要你的用户同意许可证,你就可以分发它。这可能是最好的,如果它与AMDs一起工作。@PeterCordes我认为它不应该,因为驱动程序提供的OpenCL.dll也只是一个ICD,任何ICD(如果不是太旧的话)都应该能够加载任何驱动程序。带有实际实现的dll写在注册表中的“HKLM\SOFTWARE\Khronos\OpenCL\Vendors”中,ICD(OpenCL.dll)就是在这里查找它们的。Ok。我不理解你最后的评论,如果用户安装图形驱动程序时安装了OpenCL运行时,这意味着每个人都会在他们的现代机器上安装OpenCL,所以理论上他们不会有问题,不是吗?在Windows上,仍然有可能没有GPU驱动程序和“基本图形”Windows附带的驱动程序没有OpenCL。