2013-10-16 60 views
6

我在使用Khronos Group的cl.hpp编写了一个小巧的hello world OpenCL程序,用于OpenCL 1.2和nVidia的openCL库。驱动程序和ICD我支持OpenCL 1.1。由于nVidia方面不支持1.2,我在OpenCL 1.2所需的函数上遇到一些错误。无法在1.1版本中使用1.2头文件编译OpenCL应用程序

另一方面,OpenCL 1.2的cl.hpp有一个标志CL_VERSION_1_1,以在1.1模式下运行标题,但它不起作用。任何人都有类似的经验或解决方案?

注意:版本1.1的cl.hpp工作,但在编译期间会生成许多警告。这就是我试图使用1.2版本的原因。

+0

我有同样的问题,只是使用1.1头。将其复制到cuda/include/CL目录并永久保存。看来Nvidia绝不会支持OpenCL 1.2。奇怪的是,1.1头文件对我没有任何警告。 CentOS 6.2与gcc 4.8.1。 –

回答

1

看起来像唯一的方法是在使用1.1功能的设备时使用OpenCL 1.1标头。

+2

我的反应:哦,对于nVidia卡拥有者来说太糟糕了。我更愿意使用像OpenCL这样的开放,可移植,易于理解的技术,而不是像CUDA这样的死胡同的专有框架。 – Thomas

6

您可以定义标志CL_USE_DEPRECATED_OPENCL_1_1_APIS,它将使1.2 hpp文件1.1兼容。

#define CL_USE_DEPRECATED_OPENCL_1_1_APIS 

这就是我在NVIDIA和AMD上所做的。像魅力一样工作

+0

我会尽快找到我的另一台电脑,它的来源是。编译错误是关于'clRetainDevice'和'clReleaseDevice',它们都是OpenCL 1.2相关的函数。当我分析代码时,看起来他们可以被“CL_VERSION_1_1”禁用,但我也会尝试你建议的国旗。 – bayindirh

+0

不幸的是,设置标志并没有阻止头尝试链接到'clRetainDevice()'和'clReleaseDevice()'。尽管如此,我会进一步调查。 – bayindirh

7

不幸的是NVIDIA分发了一个旧版本的OpenCL ICD(将API调用分发给适当的驱动程序的库)。你最好的选择是要么

  • 获得一个更新版本的ICD(如果你使用Linux,这是libOpenCL.so,你可以在AMD的APP SDK中找到一个更新的副本) 。缺点是如果你分发你的编译代码,它也需要1.2 ICD。
  • 使用OpenCL 1.1头文件,除了可以使用最新的cl.hpp。它应该(理论上)检测到它正在与OpenCL 1.1头结合,并禁用所有OpenCL 1.2代码(尽管如此,这些代码还没有得到很多测试)。使用最新的cl.hpp的优点是有很多错误修复无法返回到cl.hpp的1.1版本。
  • 你可以这样做:

    #include <CL/cl.h> 
    #undef CL_VERSION_1_2 
    #include <CL/cl.hpp> 
    

    我刚刚实施,在我的代码,它似乎做的伎俩。

+0

您仍然需要按照Erik的回答来定义CL_USE_DEPRECATED_OPENCL_1_1_APIS。 –

+1

很遗憾nVIDIA试图杀死如此绝望的OpenCL,而不是给予适当的支持。例如,现在他们的工具甚至没有剖析或记录OpenCL内核... – DarkZeros

+0

它的工作原理! Nvidia非常沉默,对OpenCL没有什么可说的。英特尔将GPU OpenCL支持与MSWIndows结合使用。他们运气不好!支持OpenCL 2.0的AMD在Linux下是非常有前途的技术,但我还没有获得任何卡。 – 42n4

1

可以调用可以设置clBuildProgram的选项如下

const char options[] = "-cl-std=CL1.1"; 

clBuildProgram(program, 1, &devices, options, NULL, NULL); 

这迫使编译器使用的OpenCL 1.1无论哪个版本是由您的设备

4

我受够了支持与英特尔,Nvidia和AMD下载几个GB的OpenCL SDK有不同的问题:

  • Intel需要注册并有临时许可证。
  • Nvidia SDK不支持OpenCL 2.0,无论如何您必须下载cl.hpp。
  • AMDs cl.hpp文件定义了可能与MSVC的最小和最大宏冲突的最小和最大宏(我花了太多时间来计算如何使用例如NOMINMAX来解决这个问题)。头文件与Khronos定义的头文件不一样(不存在最小/最大问题)。

所以,我下载的源代码,并从Khronos的包括由该SO answer的建议和编制的OpenCL.lib文件自己。包含和OpenCL.lib文件是几MB。这比Intel/Nvidia/AMD SDK中所有额外的东西要小得多!我可以在我的项目中包含OpenCL includes和OpenCL.lib文件,而不必再告诉其他人下载SDK。

来自Khronos registry的OpenCL 2.0包含一个新的C++绑定文件cl2.hpp。看看这个文件,我已经确定使用OpenCL 2.0支持不推荐使用的函数的正确方法就像这样。

#define CL_HPP_MINIMUM_OPENCL_VERSION 110 
#define CL_HPP_TARGET_OPENCL_VERSION 120 
#define CL_HPP_CL_1_2_DEFAULT_BUILD 
#include "CL/cl2.hpp" 

这是因为cl2.hpp文件有此代码

#if CL_HPP_MINIMUM_OPENCL_VERSION <= 100 && !defined(CL_USE_DEPRECATED_OPENCL_1_0_APIS) 
# define CL_USE_DEPRECATED_OPENCL_1_0_APIS 
#endif 
#if CL_HPP_MINIMUM_OPENCL_VERSION <= 110 && !defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) 
# define CL_USE_DEPRECATED_OPENCL_1_1_APIS 
#endif 
#if CL_HPP_MINIMUM_OPENCL_VERSION <= 120 && !defined(CL_USE_DEPRECATED_OPENCL_1_2_APIS) 
# define CL_USE_DEPRECATED_OPENCL_1_2_APIS 
#endif 
#if CL_HPP_MINIMUM_OPENCL_VERSION <= 200 && !defined(CL_USE_DEPRECATED_OPENCL_2_0_APIS) 
# define CL_USE_DEPRECATED_OPENCL_2_0_APIS 
#endif 

请注意,您不再需要(也不应该)包括<CL/opencl.h>了。

最后,#include "CL/cl2.hpp"后,为了得到我的代码与Boost/Compute工作,我不得不添加

#undef CL_VERSION_2_0 

我自己的OpenCL代码工作没有这一点,但升压/计算没有。 It appears I'm not the only one having this issue。我的GPU不支持OpenCL 2.0。

+0

肯定会看看。非常感谢! – bayindirh

+2

看到有人像男人一样真正承担这一障碍让人耳目一新! –