Struct Derefencing是否有效OpenCL?

时间:2014-07-03 00:03:03

标签: opencl

我倾向于编写如下的OpenCL代码:

void do_something(float4 *thefoo)
{
    thefoo->s0++;
}

__kernel void MyKernel(__global float4 myfloat)
{
    do_something(&myfloat);
}

当然,这是一个玩具的例子。它在Nvidida的OpenCL SDK(我可以访问)下按预期工作,但我的朋友/项目合作伙伴正在运行AMD APP SDK,他抱怨这不能编译。它给出了:

error: expression must have pointer-to-struct-or-union type

使用(*thefoo).s0++可以在他的系统上运行,但它会使代码非常难看。

我在OpenCL规范中找不到任何->运算符,但我也不认为我违反了任何指针限制。我写的是有效的OpenCL吗?

此外,我打算在上面的上下文中使用结构而不是矢量类型编写更多代码。如果 我的错误,那么当他提取我的代码时,我会遇到同样的问题吗?

1 个答案:

答案 0 :(得分:3)

因为float4不是结构;它是一种内置的矢量类型。

您必须使用.运算符来访问向量的组件。这就是为什么(*thefoo).s0++将适用于所有符合标准的OpenCL实现,而thefoo->s0++则不会。

有关详细信息,请参阅OpenCL规范中的6.1.7(“向量组件”)部分。