Как преодолеть код ошибки -11 cl_build_program_failure - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь передать функции из связанных списков (симуляция частиц) ядрам 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;
              ^ ~~~~~~~~~~~

Я не уверен, что это значит, могу ли я не разыменоватьуказатели, которые находятся в устройствах адресного пространства?

1 Ответ

0 голосов
/ 17 ноября 2018

Указатели всегда ссылаются на определенное адресное пространство: 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, и он всегда должен быть явным, но что вы можете сделать.)

...