OpenCL2.0:将数组结构传递给opencl内核
其目的是能够在内核之间传递通用结构,并对结构中的数组元素执行基本操作。数组元素被包装在标记的并集中 每个数组都声明为一个元素数组,但我使用clSVMAlloc来分配一个预先确定大小的数组n。这里的目的是确保所有数据都驻留在结构中,并且数组将位于指向结构的指针的某个偏移位置 以下是数据结构: 主人 装置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
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);