c++ - 如何在opencl中使用用户定义的结构

标签 c++ opencl

我正在尝试探索在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/

相关文章:

c++ - 尽管在 OpenFEC 库中链接,但 undefined reference

c++ - 即使包含头文件,程序也会出现 LNK2019 错误

c++ - 如何使用 typedef 完全隐藏特定类型?

opencl - 在 OpenCL 中,与 barrier() 相比,mem_fence() 做什么?

c - 在 Windows 8 (MinGW) 中链接 OpenCL 库

opencv - CL_INVALID_COMMAND_QUEUE opencl

c++ - 集合论数据结构

c++ - isalpha 总是返回 0

python - 在 Python 中使用 OpenCL 并行化循环

opencv - ARM A9是否支持OpenCL加速?