我想发布一个使用openCL的Windows / Linux应用程序,但我找不到最好的方法。
目前我的问题仅出现在Windows上:
1-我使用Intel CPU,如何管理Intel和AMD(最终用户的CPU)?
2-对于使用Visual Studio DLL的应用程序的分发,我们使用Visual Studio Redistributable来轻松管理它并避免大量安装Visual Studio。 openCL有这样的包吗?
3-最后,我不知道是否必须提供OpenCL.dll(不同观点的例子here)
我在网上阅读了有关此问题的几个主题,但没有明确的解决方案。
感谢您的帮助。
答案 0 :(得分: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)
1-我使用的是英特尔CPU,如何管理英特尔和AMD(最终用户的CPU)
你是在谈论在CPU上运行OpenCL内核,还是在GPU上运行内核时只运行主机端代码?因为如果是前者(在CPU上),你的用户需要安装各自的OpenCL CPU实现,IIRC英特尔CPU实现不会在AMD上运行(或者至少是以前的情况,也许它现在不同......)< / p>
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是非常荒谬的......