Struct OpenCL:从内联函数初始化结构字段无效

Struct OpenCL:从内联函数初始化结构字段无效,struct,initialization,kernel,opencl,jocl,Struct,Initialization,Kernel,Opencl,Jocl,我有一个OpenCL内核代码,它的行为不符合预期。使用gcc编译的类似C代码工作良好 struct data { short* a; }; typedef struct data Data; inline void foo(Data* d) { short b[1] = {99}; d->a = b; } __kernel void bar(__global short* output) { Data d; foo(&d); s

我有一个OpenCL内核代码,它的行为不符合预期。使用gcc编译的类似C代码工作良好

struct data {
    short* a;
};

typedef struct data Data;

inline void foo(Data* d) {
    short b[1] = {99};
    d->a = b;
}

__kernel void bar(__global short* output) {
    Data d;
    foo(&d);
    short val = d.a[0];
    int id = get_global_id(0);
    output[id] = val;
}
始终输出
[0,0,…,0]

如果我在
\uu内核条中初始化
d.a
,并且只在
foo
中分配
d->a[0]=99
,它将按预期工作并输出
[99,99,…,99]


提前谢谢

更新:
我使用Java和JOCL作为主机代码

正如斯科特建议的那样,我已经改变了
d->a=bfoo
中的code>到
*d->a=*b
并且它在C版本中工作得很好。但会导致MacOS上的OpenCL出现以下错误:

Exception in thread "main" org.jocl.CLException:
CL_BUILD_PROGRAM_FAILURE Build log for device 0:
CVMS_ERROR_COMPILER_FAILURE: CVMS compiler has crashed or hung building an element.
at org.jocl.CL.clBuildProgram(CL.java:9368)
...
或使用AMD CPU的Windows上的JVM终端:

# A fatal error has been detected by the Java Runtime Environment:
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x000007fedfeb007a, pid=3816, tid=4124
# JRE version: 7.0-b147
# Java VM: Java HotSpot(TM) 64-Bit Server VM (21.0-b17 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# C  [amdocl64.dll+0x60007a]

我认为问题在于:函数foo设置了一个指针,调用方使用该指针指向foo返回时超出范围的局部变量的地址。当调用者访问该指针时,范围外变量中的数据可能是99,也可能不是99。为了演示,请为此代码生成一个gcc调试版本。它起作用了。现在,在foo(&d)之后和val=d.a[0]之前添加printf(hello\n”)。现在它失败了。这是因为printf调用覆盖了包含超出范围99值的堆栈内存

也许你打算:


*d->a=*b;代替d->a=b;

d->a=b;
更改为
*d->a=*b;
非常适合gcc版本。但在OpenCL内核中会导致以下错误:
为设备0生成日志:CVMS\u错误\u编译器失败:CVMS编译器崩溃或挂起生成元素。
:(这不太好。我只知道做实验。例如,你可以删除'inline',看看会发生什么。你也可以尝试'd->a[0]=b[0];'。还要确保short不是问题。我认为旧的opencl(1.0)不支持short,除非作为扩展启用。