我正在尝试使用共享虚拟内存将链表(粒子模拟)上的函数外包给OpenCL内核。 我尝试通过简单地遍历链接列表并更改其中每个元素(结构)的值开始。
这是.cl文件(实际的typedef与主机代码保持一致):
//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文件的任何想法?据我了解,我可以在源代码中定义结构,typedef和函数,并在内核函数中使用它们。
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;
^ ~~~~~~~~~~~
我不确定这意味着什么,是否可以不取消引用设备地址空间中的指针?
答案 0 :(得分:0)
指针始终引用特定的地址空间:global
,constant
,local
或private
。即使未注释指针,默认情况下也会根据上下文选择其中之一。就您而言,
__global ParticleList *pList
(正确地)注释为位于global
空间中,而结构中的字段next
没有注释:
struct ParticleList
{
Particle p;
struct ParticleList *next; // <--- no address space specified, defaults to `private`
}
很明显,next
字段不会不指向在private
内存中分配的结构,因此该默认值是错误的,您应该显式指定global
。
(就我个人而言,我认为默认地址空间是OpenCL设计中的一个错误,应该始终是明确的,但是您可以做什么。)