我倾向于编写如下的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吗?
此外,我打算在上面的上下文中使用结构而不是矢量类型编写更多代码。如果 我的错误,那么当他提取我的代码时,我会遇到同样的问题吗?
答案 0 :(得分:3)
因为float4
不是结构;它是一种内置的矢量类型。
您必须使用.
运算符来访问向量的组件。这就是为什么(*thefoo).s0++
将适用于所有符合标准的OpenCL实现,而thefoo->s0++
则不会。
有关详细信息,请参阅OpenCL规范中的6.1.7
(“向量组件”)部分。