Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在opencl中使用自定义结构_C++_Opencl - Fatal编程技术网

C++ 如何在opencl中使用自定义结构

C++ 如何在opencl中使用自定义结构,c++,opencl,C++,Opencl,我试图探索在opencl中使用结构的方法 我首先尝试struct(在主机上定义) 和结构(在设备上定义) 使用定义的结构,我创建了两个缓冲区(para_输入和para_输出),并用不同的值初始化它们。内核函数将值从para_输入复制到para_输出 这个例子很好用 但是,当我在结构中添加cl_int16时,复制内核不起作用。 以下是修改后的结构: typedef struct UserStruct { cl_int x; cl_int y; cl_int z;

我试图探索在opencl中使用结构的方法

我首先尝试struct(在主机上定义)

和结构(在设备上定义)

使用定义的结构,我创建了两个缓冲区(para_输入和para_输出),并用不同的值初始化它们。内核函数将值从para_输入复制到para_输出

这个例子很好用

但是,当我在结构中添加cl_int16时,复制内核不起作用。 以下是修改后的结构:

typedef struct UserStruct {

    cl_int x;
    cl_int y;
    cl_int z;
    cl_int w; 

    cl_int16 vn16;
} UserStruct;
和结构(在设备上定义)

是否需要在主机和设备上对齐结构?
或者opencl中最流行的使用结构的方式是什么?谢谢。

展开评论:

您的问题似乎是由C编译器和OpenCL编译器中默认结构对齐方式的差异造成的。也就是说,C编译器将结构打包到最少80个字节,而OpenCL编译器将其对齐到128个字节(这在性能方面是一件好事)。您可以通过显式指定来匹配对齐方式:要么打包两个结构,要么将两个结构都对齐到128字节。有关详细信息,请参阅和编译器的文档(很可能使用相同的符号)

在任何情况下,我都建议使用128字节的对齐方式,除非您有空间压力。将您的结构声明为:

typedef struct UserStruct {

    cl_int x;
    cl_int y;
    cl_int z;
    cl_int w;

    cl_int16 vn16;
} __attribute__ ((aligned (128))) UserStruct;
和主机的情况类似


作为旁注,没有什么可以阻止您对主机和设备代码使用相同的结构<代码> > CytINT//Calp>S只是本地类型的别名(尽管显式对齐说明符仍然是必需的,因为结构可能会被不同编译器)处理。

< > Windows机器或VS C++编译器,请尝试以下行来对齐结构,
\uuuuu属性\uuuu
在GNC编译器上工作

typedef __declspec(align(128)) struct UserStruct {

    cl_int x;
    cl_int y;
    cl_int z;
    cl_int w;

    cl_int16 vn16;
} UserStruct;

两种结构的
sizeof()
是否相等?此外,一个可运行的示例也会有所帮助(或者,至少,解释一下“复制内核不工作”)。谢谢您的回复。你是对的。主机和设备的大小不同。主机上的大小为80。但设备上的大小是128。你能给我一些处理这个问题的提示吗?我没有在规范中得到对齐的想法。谢谢
typedef struct UserStruct {
    int x;
    int y;
    int z;
    int w;

    int16 vn16;
} UserStruct;
typedef struct UserStruct {

    cl_int x;
    cl_int y;
    cl_int z;
    cl_int w;

    cl_int16 vn16;
} __attribute__ ((aligned (128))) UserStruct;
typedef __declspec(align(128)) struct UserStruct {

    cl_int x;
    cl_int y;
    cl_int z;
    cl_int w;

    cl_int16 vn16;
} UserStruct;