OpenCL C ++上下文属性语法

时间:2013-12-06 10:56:57

标签: c++ syntax opencl

我正在尝试使用C ++绑定学习OpenCL。到目前为止我唯一没有理解的是以下语法。尝试根据设备类型创建上下文:

cl::Context context(CL_DEVICE_TYPE_CPU, properties); 

我正在使用nvidia的ICD,据我所知,不会让你在没有定义平台的情况下创建上下文,所以我需要第二个参数。根据标准,cl_context_properties应该是属性名称列表,后跟相应的值,以0结尾。标准中只有一个cl_context_properties(表4.4),即属性{{1并且具有CL_CONTEXT_PLATFORM类型的属性值。基于此,我认为这应该没问题:

cl_platform_id

其中cl_context_properties properties[] = { CL_CONTEXT_PLATFORM, platforms[0], 0}; 是我的平台向量。但它将无法编译,除非我放置platforms

platforms[0]

这来自(cl_context_properties)(platforms[0])() 头文件中的示例代码。

1)看起来cl.hpp被强制转换为platforms类型。为什么这有必要?

2)为什么最后还有一组括号cl_context_properties

请假设我不是C ++专家(绝对正确)。我知道这只是一件小事,但我不喜欢编写我不完全理解的代码。

1 个答案:

答案 0 :(得分:3)

我没有任何与OpenCL相关的经验。 所以主要是我的答案是关于C ++使用。

  1. 为什么需要演员? 强制转换是必要的,因为您声明了C数组properties[],其中每个元素的类型应为cl_context_properties。 由于cl_platform_id具有不同的类型,因此应将其强制转换为适当的类型 - cl_context_properties。 你正在使用C风格的演员,如下所示: (type_to_cast_to)(expression_to_be_cast)。 如果expression_to_be_cast只是一个变量,就像你的情况一样,你可以省略expression_to_be_cast周围的括号:

    cl_context_properties properties [] =      {CL_CONTEXT_PLATFORM,(cl_context_properties)平台[0],0};

  2. 为什么最后还有一组括号()? 您应该使用括号,因为变量platform[0]的类型为cl::Platform,它不是普通类型(例如int,char,double),而cl::Platform类是包装器。您应该调用此类的operator()以获取所需类型cl_platform_id的基础数据。 所以下一个代码应该更简单: cl_context_properties properties[] = { CL_CONTEXT_PLATFORM, static_cast<cl_context_properties>(platforms[0]()), 0};
  3. 在这里,您正在使用C ++样式转换static_cast进行强制转换,最好在对象operator()上调用platforms[0]返回的对象的C ++(you can read about it here)中强制转换。 operator()在类cl::detail::Wrapper< T >class reference)中定义,该类是类cl::Platform的父类