分发使用OpenCL的应用程序

问题描述 投票:0回答:2

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

目前我的问题只出现在Windows上:

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

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

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

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

谢谢您的帮助。

windows opencl intel amd
2个回答
3
投票

1)您写入OpenCL API,它适用于您的用户拥有的任何硬件。使用您要支持的较低版本的标头(例如,如果您想要定位1.1及更高版本,请使用1.1中的cl.h)。

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

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

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


-1
投票

1-我使用的是英特尔CPU,如何管理英特尔和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是非常荒谬的...

© www.soinside.com 2019 - 2024. All rights reserved.