所以我想在openCL中定义一个可在主机和设备上使用的结构,它使用内置的openCL float4数据类型。
在主机端,框架带有cl_float4类型,但在设备上它只是float4。
所以,如果我创建一个像这样的结构......
typedef struct
{
cl_float4 a, b;
} MyStruct;
...然后尝试将该结构传递到内核(通过缓冲区)我收到错误。
如果我声明如下......
typedef struct
{
float4 a,b;
}
...可以在设备上运行,但不能在主机上运行。
那么有没有办法让它能够在同一个结构体中使用我的程序两侧内置的向量类型的openCL?
答案 0 :(得分:4)
C预处理器可以通过对代码进行不同的处理来帮助您,具体取决于代码是在主机还是设备上进行编译。
以下是一些可能的解决方案:
typedef struct
{
#ifdef __OPENCL_C_VERSION__
float4
#else
cl_float4
#endif
a, b;
} MyStruct;
或:
#ifdef __OPENCL_C_VERSION__
typedef float4 cl_float4;
#endif
typedef struct
{
cl_float4 a, b;
} MyStruct;
或:
#ifndef __OPENCL_C_VERSION__
typedef cl_float4 float4;
#endif
typedef struct
{
float4 a, b;
} MyStruct;
或只使用cl_float4
,并编译OpenCL代码,如下所示:
clBuildProgram(program, 1, &device, "-Dcl_float4=float4", NULL, NULL);
答案 1 :(得分:0)
除非您对结构定义非常小心,否则我会避免使用此方法。 OpenCL设备架构的数据结构对齐规则可能与OpenCL主机架构的数据结构对齐规则有很大不同。有关数据结构对齐的概述,请参阅this Wikipedia article。
TLDR :结构的大小可能因设备而异,也可能因结构开头的每个结构成员的偏移量而异。如果发生这种情况,您的程即使您在当前的主机/设备组合中使用此功能,也不能保证可以使用其他硬件组合。