Цель состоит в том, чтобы иметь возможность передавать общую структуру между ядрами и выполнять базовые операции над элементами массива в структуре.Элементы массива оборачиваются теговым объединением.
Каждый массив объявлен как массив из одного элемента, но я использую 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);