我可以使用struct作为OpenCL内核参数吗?
我想在NVIDIA OpenCL 1.2(NVIDIA驱动程序352.39)中使用struct type作为OpenCL内核参数
我试过,但它使CL_OUT_OF_RESOURCE错误.
我的代码有什么问题?
[用于结构定义]
/* struct type definition */
typedef struct _st_foo
{
int aaa;
int bbb;
.....
int zzz;
}st_foo; // st_foo doesn't have any pointer members
Run Code Online (Sandbox Code Playgroud)
[主机代码]
/* 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);
Run Code Online (Sandbox Code Playgroud)
[内核代码]
__kernel void testfunction(__global const st_foo *stVar)
{
printf("stVar->aaa=%d\n", stVar->aaa);
}
Run Code Online (Sandbox Code Playgroud)
如果不使用OpenCL数据类型,则在OpenCL中声明结构是不安全的.而且,对齐可能是一个问题,强制主机/设备编译器中的数据包对齐.
您应该将结构声明为:
[主办]
typedef struct __attribute__ ((packed)) _st_foo
{
cl_int aaa;
cl_int bbb;
.....
cl_int zzz;
}st_foo;
Run Code Online (Sandbox Code Playgroud)
[设备]
typedef struct __attribute__ ((packed)) _st_foo
{
int aaa;
int bbb;
.....
int zzz;
};
Run Code Online (Sandbox Code Playgroud)
另外,如果你只想要一个参数,而不是一个结构数组,那么只需将它传递给:
clSetKernelArg(ckKernel, 0, sizeof(mystruct), mystruct);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4081 次 |
| 最近记录: |