我想分发一个使用OpenCL的Windows/Linux应用程序,但我找不到最好的方法。
目前我的问题只在Windows上:
1.我使用的是Intel CPU,如何管理Intel和AMD(最终用户的CPU)?
1.对于使用Visual Studio DLL的应用程序的分发,我们有Visual Studio Redistributable可以轻松管理,并避免大量安装Visual Studio。OpenCL有这样的包吗?
1.最后,我不知道我是否必须提供OpenCL.dll(不同观点的例子here)
我在网上读了几个关于这个问题的主题,没有明确的解决方案。
2条答案
按热度按时间nukf8bse1#
1)您可以向OpenCL API写入数据,它可以与用户拥有的任何硬件一起工作。使用您想要支持的较低版本的标题(例如,如果您想要目标1.1或更高版本,请使用1.1中的cl. h)。
2)OpenCL运行时在用户安装图形驱动程序时安装在用户的机器上。你不需要(也不应该)重新分发任何东西。
3)请不要重新分发OpenCL.dll
你可能需要处理的一个问题是,如果你的用户没有在他们的机器上安装任何OpenCL。在这种情况下,对clGetPlatformID的调用将失败。有各种方法来处理这个问题,所有平台特定的。动态链接到OpenCL.dll是一种方法,或者运行帮助进程来测试OpenCL是另一种方法。在Windows上,一个优雅的解决方案是延迟加载OpenCL.dll,并挂钩该API,以便在后期绑定失败时返回0。
pkbketx92#
1-我使用的是Intel CPU,我如何管理Intel和AMD(最终用户的CPU)
你是在谈论在CPU上运行OpenCL内核,还是在内核运行在GPU上时只运行主机端代码?因为如果是前者(在CPU上),您的用户将需要安装各自的OpenCL CPU实现,IIRC的英特尔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,这是非常荒谬的。