C++ 部署OpenCL应用程序?

C++ 部署OpenCL应用程序?,c++,opencl,C++,Opencl,我目前正在学习OpencL,发现理解它的实际工作原理有些困难。 我正在将MinGW编译器与ATI APP SDK一起使用。 当我运行目标时,会收到错误消息 我没有将任何OpenCL.dll放在与我的应用程序相同的文件夹中。 现在在Windows上搜索一下,我可以在 C:/Windows/SysWOW64 C:/Windows/System32/DriverStore/... C:/Windows/System32 C:/Program Files(x86)/AMD APP SDK /...

我目前正在学习OpencL,发现理解它的实际工作原理有些困难。 我正在将MinGW编译器与ATI APP SDK一起使用。 当我运行目标时,会收到错误消息

我没有将任何OpenCL.dll放在与我的应用程序相同的文件夹中。 现在在Windows上搜索一下,我可以在

C:/Windows/SysWOW64
C:/Windows/System32/DriverStore/...
C:/Windows/System32
C:/Program Files(x86)/AMD APP SDK /...
所以我的问题是我应该如何部署我的应用程序?
我应该将OpenCL.dll与我的应用程序一起分发吗?

是的,您应该将所有非标准dll与应用程序一起分发。您可以将其与应用程序放在同一文件夹中,这样可以轻松卸载应用程序,只需删除文件夹即可。或者,如果使用安装程序,请将其放入目标系统的系统文件夹(使用安装程序)。通常,一个好的安装程序应该能够确定系统目标文件夹

Windows将首先在可执行路径中搜索dll,然后在系统路径中搜索。如你所知。所以它通常对你的应用程序没有影响。除了加载你的应用程序会有一点扩展之外。

是的,根据中的“hello world”示例,你应该在路径的某个地方有OpenCL.dll。将您的软件调用连接到设备上运行的内核将需要此功能


请注意,一般情况下,Windows会根据(在查看当前目录/系统目录后)的不同意见查找.dll文件。

不同意见:永远不要在应用程序中重新分发OpenCL.dll!它属于系统文件夹,只能由平台提供商(苹果、NVIDIA、AMD、英特尔等)的OpenCL驱动程序安装。如果您的系统没有安装它,将自己的应用程序与应用程序一起交付不会使其运行得更好,因为您没有OpenCL平台供其查找。

应用程序找不到clReleaseDevice的原因是您将应用程序写入了OpenCL 1.2头,但您的计算机上只有OpenCL 1.1运行时。不能在OpenCL1.1运行时上调用OpenCL1.2API。我建议使用OpenCL1.1标题,除非您仅在OpenCL1.2设备上运行。它将确保您的代码在OpenCL 1.1平台和设备上安全运行。

感谢它的成功!为了明确起见,我需要分发SDK bin文件夹中的dll,它是独立于平台的,即它将在NVIDIA、Intel或任何其他处理单元上运行?AMD应用程序SDK中的dll应在NVIDIA GPU上工作,直到您调用仅存在于OpenCL 1.2中的函数,然后您的应用程序将出现故障。请确保OpenCL1.1和1.2有单独的代码路径,以避免出现这种情况。@chippies,正如Dithermaster所回答的,这不是正确的解决方案。重新分发dll是不正确的。你能为正确的方法提供参考吗?OpenCL1.1拥有更多的市场份额,因为它同时受到Nvidia和AMD的支持。如果你没有OpenCL1.2的功能也能生存,那么就使用OpenCL1.1吧。如果OpenCL1.2的特性相对于OpenCL1.1提供了显著的速度提升,那么就编写两个代码路径,一个用于OpenCL1.1,另一个用于OpenCL1.2。然后将OpenCL 1.2 DLL与您的应用程序一起提供,并确保您只在OpenCL 1.2平台上使用OpenCL 1.2代码,否则您的应用程序将发生故障。我同意“chippies”添加的内容,除了关于重新分发OpenCL.DLL的部分——如果您的平台说它是1.2,那么您可以在不重新分发任何DLL的情况下进行1.2调用。关键的一点是,在确定您拥有1.2平台和设备之前,您不能进行1.2调用。@Cool\u Coder我将尝试总结一下。Dithermaster所说的是处理对第三方DLL依赖的正确方法,这些DLL有自己的安装程序(如AMD或Nvidia的驱动程序)。您必须编写代码来加载计划使用的DLL函数。此代码必须同时加载OpenCL 1.1和1.2函数,以避免链接到OpenCL.dll(这会导致原始错误)。该过程将沿着搜索OpenCL.dll的路线进行,如果找到,则尝试使用LoadLibrary/GetProcAddress加载所有需要的函数。@Cool\u Coder如果加载了CL1.2函数,则检查平台是否支持CL1.2。如果确实如此,则使用CL1.2代码路径,否则请检查是否支持CL1.1,如果可用,请使用该代码路径。如果CL1.1不可用,则转到仅CPU代码路径。如果没有加载CL函数/OpenCL.dll,则直接转到CPU代码路径。如果存在多个平台且其中一个平台不支持CL1.2,则有必要检查CL平台是否支持CL1.2,即使OpenCL.dll提供了CL1.2函数。DLL将提供函数,但在CL1.1平台上调用它们是正确的。在Windows上,有两种处理OpenCL.dll的方法是可选的:手动动态执行(使用LoadLibrary/GetProcAddress)或让操作系统为您动态执行(使用/DELAYLOAD链接器选项)。那么应该如何编写一个同时针对OpenCL 1.1和1.2设备的应用程序呢。在我看来,必须编译两个版本的应用程序,让应用程序安装程序只安装相应的版本。但是,当同一台机器上混合使用OpenCL 1.1和1.2时,针对OpenCL 1.2的代码仍然需要OpenCL 1.1设备和平台的回退路径。直接调用1.1 API并对1.2 API使用动态方法,那么您将不会得到“未找到入口点”错误。在Windows上,这将是LoadLibrary/GetProcAddress。@chippies:如果您有ICD但没有驱动程序,则clGetPlatformIDs返回0。@Cool\u Coder ICD==可安装的客户端驱动程序。在OpenCL的早期,每个供应商都有自己的OpenCL.dll,这使得在一台PC上拥有多个供应商变得很困难,但我们已经远远超过了那个时代。system32中的OpenCL.dll应该是ICD加载程序。每个供应商都注册自己的ICD,ICD加载器只查找并报告