OpenCL:使用struct作为内核参数

OpenCL:使用struct作为内核参数,opencl,Opencl,我可以使用struct作为OpenCL内核参数吗 我想在NVIDIA OpenCL 1.2(NVIDIA驱动程序352.39)中使用struct type作为OpenCL内核参数 我试过了,但这会导致资源错误 我的代码有什么问题 [用于结构定义] /* struct type definition */ typedef struct _st_foo { int aaa; int bbb; ..... int zzz; }st_foo; // st_fo

我可以使用struct作为OpenCL内核参数吗

我想在NVIDIA OpenCL 1.2(NVIDIA驱动程序352.39)中使用struct type作为OpenCL内核参数

我试过了,但这会导致资源错误

我的代码有什么问题

[用于结构定义]

/* struct type definition */
typedef struct _st_foo
{
    int aaa;
    int bbb;
     .....
    int zzz;
}st_foo;      // st_foo doesn't have any pointer members
[主机代码]

/* OpenCL initalize... */

st_foo stVar;

cl_mem cm_buffer;
cm_buffer = clCreateBuffer(cxContext, CL_MEM_READ_ONLY, sizeof(st_foo), NULL, NULL);
clSetKernelArg(ckKernel, 0, sizeof(cl_mem), (void*)&cm_buffer);
clEnqueueWriteBuffer(cqueue, cm_buffer, CL_TRUE, 0, sizeof(st_foo), &stVar, 0, NULL, NULL);
[内核代码]

__kernel void testfunction(__global const st_foo *stVar)
{
    printf("stVar->aaa=%d\n", stVar->aaa);
}

如果不使用OpenCL数据类型,在OpenCL中声明结构是不安全的。而且,对齐可能是一个问题,强制主机/设备编译器中的数据包对齐

您应该将结构声明为:

[主持人]

typedef struct __attribute__ ((packed)) _st_foo
{
    cl_int aaa;
    cl_int bbb;
     .....
    cl_int zzz;
}st_foo;
[设备]

typedef struct __attribute__ ((packed)) _st_foo
{
    int aaa;
    int bbb;
     .....
    int zzz;
};
另外,如果您只需要一个参数,而不是一个结构数组,那么只需将其作为:

clSetKernelArg(ckKernel, 0, sizeof(mystruct), mystruct);

如果不使用OpenCL数据类型,在OpenCL中声明结构是不安全的。而且,对齐可能是一个问题,强制主机/设备编译器中的数据包对齐

您应该将结构声明为:

[主持人]

typedef struct __attribute__ ((packed)) _st_foo
{
    cl_int aaa;
    cl_int bbb;
     .....
    cl_int zzz;
}st_foo;
[设备]

typedef struct __attribute__ ((packed)) _st_foo
{
    int aaa;
    int bbb;
     .....
    int zzz;
};
另外,如果您只需要一个参数,而不是一个结构数组,那么只需将其作为:

clSetKernelArg(ckKernel, 0, sizeof(mystruct), mystruct);

我试图将结构作为非指针值传入,但无法构建内核。是否允许某些静态对象作为内核参数?非缓冲区的内核参数(即:非指针、int、structs等)可以直接作为参数传递。只要设备中有足够的可用常量内存来保持该结构,我试图将结构作为非指针值传入,但无法构建内核。是否允许某些静态对象作为内核参数?非缓冲区的内核参数(即:非指针、int、structs等)可以直接作为参数传递。只要设备中有足够的固定内存来保持这种结构。