gpt4 book ai didi

c - 如何克服错误代码-11 cl_build_program_failure

转载 作者:行者123 更新时间:2023-11-30 16:25:36 25 4
gpt4 key购买 nike

我正在尝试使用共享虚拟内存将链表(粒子模拟)上的函数外包给 OpenCL 内核。我尝试首先简单地迭代一个链接列表并更改其中每个元素(结构)的一个值。

这是.cl文件(typedef为real是为了与主机代码保持一致):

//real is of type cl_double
typedef cl_double real;
typedef cl_double2 real2;

typedef struct
{

// Mass
real m;
// Position
real2 x;
// Velocity
real2 v;
// Force
real2 F;
// Force_old
real2 F_old;
// Bodytype
cl_char body;

} Particle;

// Datastructure of linked list
typedef struct ParticleList
{

Particle p;
struct ParticleList *next;
} ParticleList;

// A cell is defined as the anchor of a linked list
typedef ParticleList *Cell;

__kernel void test(
__global ParticleList *pList){

// Check if pList->next is NULL
if(pList->next != NULL){

while(pList->next != NULL){

pList->p.body = 'Z';
pList = pList->next;
}
}


}

知道为什么它不编译 .cl 文件吗?据我了解,我可以在源代码中定义结构、类型定义和函数,并在内核函数中使用它们。

clCreateProgramWithSource 返回 CL_SUCCESS,但该程序上的 clBuildProgram 返回错误代码 -11。

也许有一些调试 opencl c 的技巧?

编辑:调用 clGetProgramBuildInfo 会产生:

1:49:19: error: assigning 'struct ParticleList *__global' to '__global 
ParticleList *' (aka '__global struct ParticleList *') changes address space
of pointer
pList = pList->next;
^ ~~~~~~~~~~~

我不确定这意味着什么,我可以不取消引用设备地址空间中的指针吗?

最佳答案

指针始终引用特定的地址空间:全局常量本地私有(private)。即使指针没有注释,默认情况下也会根据上下文选择其中之一。就您而言,

__global ParticleList *pList

(正确)注释为位于 global 空间中,而结构中的字段 next 没有注释:

struct ParticleList
{
Particle p;
struct ParticleList *next; // <--- no address space specified, defaults to `private`
}

显然,next字段指向分配在private内存中的结构体,因此这个默认值是不正确的,您应该显式指定全局

(我个人认为默认地址空间是 OpenCL 设计中的一个错误,它应该始终是显式的,但你能做什么。)

关于c - 如何克服错误代码-11 cl_build_program_failure,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53337585/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com