我正在尝试探索在opencl中使用结构的方式
我首先尝试结构(在主机上定义)
typedef struct UserStruct {
cl_int x;
cl_int y;
cl_int z;
cl_int w;
} UserStruct;
和结构(在设备上定义)
typedef struct UserStruct {
int x;
int y;
int z;
int w;
} UserStruct;
使用定义的结构,我创建两个缓冲区(para_input 和 para_output)并用不同的值初始化它们。内核函数将值从 para_input 复制到 para_output。
该示例运行良好。
但是,当我在结构中添加 cl_int16 时,复制内核不起作用。 这是修改后的结构:
typedef struct UserStruct {
cl_int x;
cl_int y;
cl_int z;
cl_int w;
cl_int16 vn16;
} UserStruct;
和结构(在设备上定义)
typedef struct UserStruct {
int x;
int y;
int z;
int w;
int16 vn16;
} UserStruct;
是否需要在主机和设备上对齐结构? 或者在 opencl 中使用结构最流行的方式是什么?谢谢。
最佳答案
扩展评论:
您的问题似乎是由 C 编译器和 OpenCL 编译器中默认结构对齐的差异引起的。也就是说,C 编译器将结构打包到最小 80 字节,而 OpenCL 编译器将其对齐到 128 字节(这对于性能而言是一件好事)。您可以通过显式指定来匹配对齐方式:要么打包两个结构,要么将两者对齐到 128 字节。请参阅OpenCL docs以及您的编译器文档(很可能使用相同的符号)了解详细信息。
无论如何,我建议使用 128 字节对齐,除非您面临空间压力。将您的结构声明为:
typedef struct UserStruct {
cl_int x;
cl_int y;
cl_int z;
cl_int w;
cl_int16 vn16;
} __attribute__ ((aligned (128))) UserStruct;
对于主机来说也是类似的。
顺便说一句,没有什么可以阻止您对主机和设备代码使用相同的结构。无论如何,cl_int只是 native 类型的别名(尽管显式对齐说明符仍然是必要的,因为该结构可能会由不同的编译器处理)。
关于c++ - 如何在opencl中使用用户定义的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35167229/