【问题标题】:Is Struct Derefencing Valid OpenCL?结构取消引用是有效的 OpenCL 吗?
【发布时间】:2014-07-03 10:25:39
【问题描述】:

我倾向于编写如下 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 是有效的吗?

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

【问题讨论】:

    标签: opencl


    【解决方案1】:

    因为float4 不是结构体;它是一个内置的向量类型。

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

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

    【讨论】:

    • 我认为向量是“C 扩展”,因此不会从结构继承任何语法,这与它们的应用程序端对应物 cl_typen 不同,后者 结构。我已经养成了这样想它们的习惯,但显然这是一个错误。
    • 只是出于好奇,哪个 OpenCL 实现与 -> 一起使用,哪个没有?
    • Nvidia 接受语法,AMD 不接受。我不知道工具包的确切版本。
    猜你喜欢
    • 1970-01-01
    • 2016-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多