opencl 2.0: передача структуры массивов в ядро ​​opencl - PullRequest
0 голосов
/ 19 мая 2018

Цель состоит в том, чтобы иметь возможность передавать общую структуру между ядрами и выполнять базовые операции над элементами массива в структуре.Элементы массива оборачиваются теговым объединением.

Каждый массив объявлен как массив из одного элемента, но я использую clSVMAlloc для выделения массива некоторого заранее определенного размера n.Цель состоит в том, чтобы гарантировать, что все данные будут находиться в структуре, и что массивы будут расположены с некоторым смещением от указателя на структуру.

Вот структуры данных:

host

typedef struct a1 { 
        cl_long r, t, n; 
        union u { cl_long i[1];
                  cl_double f[1];
                  cl_char c[1];
                  cl_char* s[1];
                  struct a1*a[1]; 
                 }u; 
        }AA;

device

typedef struct a1 { 
        long r, t, n; 
        union u { long i[1];
                  double f[1];
                  char c[1];
                  char* s[1];
                  struct a1*a[1];
                 }u; 
        }AA;

Код хоста и устройства компилируется.Я использую opencl 2.0 с интегрированной графикой Intel, которая поддерживает мелкозернистый буфер svm.

Распределение работает. Я могу получить доступ к проблеме struct wo на стороне хоста.Я попытался передать всю структуру, а также попытался передать внутренние массивы.Я предполагаю, что есть некоторая проблема выравнивания, продолжающаяся.

Я вижу ошибку CL_INVALID_KERNEL_ARGS

_kernel void plusii(__global long* x,__global long* y,__global long* z,long c){
    int i= gGID(0);
    if(i<c){ 
        z[i]=x[i]+y[i];
    }
}

host (предположим, что kaii - это правильно инициализированное ядро, которое будет вызывать plusii, gbl = 1024 и local = 256)

#define clENDRK clEnqueueNDRangeKernel
#define clSKASVM clSetKernelArgSVMPointer

clSKASVM(kaii, 0, x->u.i);
clSKASVM(kaii, 1, y->u.i);
clSKASVM(kaii, 2, z->u.i);
clSKASVM(kaii, 3, zn);
e = clENDRK(q, kaii, 1, NULL, &gbl, &local, 0, NULL, NULL);
...