Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenCL2.0:将数组结构传递给opencl内核_C_Struct_Kernel_Opencl_Memory Alignment - Fatal编程技术网

OpenCL2.0:将数组结构传递给opencl内核

OpenCL2.0:将数组结构传递给opencl内核,c,struct,kernel,opencl,memory-alignment,C,Struct,Kernel,Opencl,Memory Alignment,其目的是能够在内核之间传递通用结构,并对结构中的数组元素执行基本操作。数组元素被包装在标记的并集中 每个数组都声明为一个元素数组,但我使用clSVMAlloc来分配一个预先确定大小的数组n。这里的目的是确保所有数据都驻留在结构中,并且数组将位于指向结构的指针的某个偏移位置 以下是数据结构: 主人 装置 typedef struct a1 { long r, t, n; union u { long i[1]; double

其目的是能够在内核之间传递通用结构,并对结构中的数组元素执行基本操作。数组元素被包装在标记的并集中

每个数组都声明为一个元素数组,但我使用clSVMAlloc来分配一个预先确定大小的数组n。这里的目的是确保所有数据都驻留在结构中,并且数组将位于指向结构的指针的某个偏移位置

以下是数据结构:

主人

装置

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;
正在编译主机和设备代码。我正在使用OpenCL2.0和支持细粒度缓冲区svm的英特尔集成图形

分配工作正在进行中。。我可以在主机端访问struct w.o.问题。我试图传递整个结构,也试图传递内部数组。我假设存在一些对齐问题

我看到的错误是CL_无效的内核参数

_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];
    }
}

我没有使用SVM,所以帮不了什么忙,但我建议查看每个调用的返回值,包括前三个到clSetKernelArgSVMPointer的调用,看看哪个调用返回了该错误。此外,您正在使用clSetKernelArgSVMPointer设置一个非SVM参数。您不应该使用常规的clSetKernelArg吗?而不是您的回复!我的所有内存管理都使用clSVMAlloc。它返回指向AA结构的指针。然后我将u联合的一个元素传递到内核中。u联合是结构的一个成员,因此与clSVMAlloc返回的指针有一定的偏移量。通过仔细阅读文档,看起来这是可以的,但是由于对齐问题,我不确定是否可以将联合传递到内核中。我会测试并报告回来。我不确定2.0是否真的是这样(因为我只使用1.2),但我不相信你能在结构中传递指向OpenCL内核的指针;它们必须作为参数传递。
_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];
    }
}
#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);