Я пытаюсь передать функции из связанных списков (симуляция частиц) ядрам 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?Как я понял, я могу определять структуры, typedefs и функции в исходном коде и использовать их в функции ядра.
clCreateProgramWithSource возвращает CL_SUCCESS, но clBuildProgram в этой программе возвращает код ошибки -11.
Может быть, несколько советов по отладке opencl c?
EDIT : вызов clGetProgramBuildInfo приводит к:
1:49:19: error: assigning 'struct ParticleList *__global' to '__global
ParticleList *' (aka '__global struct ParticleList *') changes address space
of pointer
pList = pList->next;
^ ~~~~~~~~~~~
Я не уверен, что это значит, могу ли я не разыменоватьуказатели, которые находятся в устройствах адресного пространства?