我正在尝试使用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 ++专家(绝对正确)。我知道这只是一件小事,但我不喜欢编写我不完全理解的代码。
答案 0 :(得分:3)
我没有任何与OpenCL相关的经验。 所以主要是我的答案是关于C ++使用。
为什么需要演员?
强制转换是必要的,因为您声明了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};
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};
在这里,您正在使用C ++样式转换static_cast
进行强制转换,最好在对象operator()
上调用platforms[0]
返回的对象的C ++(you can read about it here)中强制转换。
operator()
在类cl::detail::Wrapper< T >
(class reference)中定义,该类是类cl::Platform
的父类