我无法在编译时(甚至是运行时)重现错误。我不熟悉JOCL,因此无法在这方面提供帮助。 我正在使用Windows,NVIDIA和JIT编译OpenCL内核。
您是否还在内核中使用分配的内存?new_vars
或者您是否只声明__local cl_var new_vars[10];
并且发生错误?
另外你是什么意思与“我试图改变结构定义包括本地在不同的地方”?您是否已将local
地址空间限定符添加到“下一个”指针? 如果是这样,那么我的以下解释可能不是解决方案。
从我所看到的,错误的潜在原因是缺少地址空间限定符(无法验证,因为我无法重现错误)。您的问题是OpenCL中的指针类型始终带有地址空间限定符private
,local
,global
或constant
(请参阅here)。如果将它保留,OpenCL默认选择private:“如果未指定地址空间限定符,则声明为指针的变量被视为指向__私有地址空间”(请参阅Notes)。
这就是你的结构发生了什么。在struct中声明了一个指向结构本身的指针,但是你没有指定任何地址空间限定符,所以private被默认设置。
写作
typedef struct cl_var{
int var;
struct cl_var* next;
} cl_var;
相当于写
typedef struct cl_var{
int var;
private struct cl_var* next;
} cl_var;
当写__local cl_var new_vars[10];
静态分配在本地内存10个cl_var对象,地址空间限定符不匹配,因为对象驻留在本地内存,但期望在私有内存中指向一个对象(“下一个”)。因此,在对象中使用指针时,程序应该会崩溃,但只能在运行时而不是编译时(除非编译器非常敏感 - 在这种情况下实际上是一件好事)。
通过编写
typedef struct cl_var{
int var;
local struct cl_var* next;
} cl_var;
你应该能够分配内存。注意:尽量避免使用“新”来命名你的数组,因为它与动态内存分配的联系(并且动态内存分配不在你的示例代码中发生的事情),它可能会让人困惑。
我不认为你可以包含一个指向自己的指针。由于它尚未定义。此外,它正在生成无限递归问题。 – DarkZeros 2014-12-05 10:23:26
@DarkZeros我最初确实有这个问题,但包括struct关键字固定,我猜它是一个不同的命名空间。此外,它在任何地方都可以,除非将它用作本地数组。 – 2014-12-05 10:48:06
'我在编译时遇到seg错误。'你的意思是你在编译时**得到一个段错误**? – 2014-12-05 10:48:48