Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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
如何为OpenCL结构数组设置正确的对齐方式?_Opencl_Gpu_Memory Alignment - Fatal编程技术网

如何为OpenCL结构数组设置正确的对齐方式?

如何为OpenCL结构数组设置正确的对齐方式?,opencl,gpu,memory-alignment,Opencl,Gpu,Memory Alignment,我的结构如下: C++: OpenCL: typedef struct{ float3 nextPos; float value; bool moved; bool nextMoved; int movePriority; int nextMovePriority; float value2; float value3; int neighbors[6]; float3 offsets[6]; float o

我的结构如下:

C++:

OpenCL:

typedef struct{
    float3 nextPos;
    float value;
    bool moved;
    bool nextMoved;
    int movePriority;
    int nextMovePriority;
    float value2;
    float value3;
    int neighbors[6];
    float3 offsets[6];
    float off1[6];
    float off2[6];
} ss;
我有一个这样的数组,我将它们传递给opencl缓冲区,但是当我在内核中使用它们时,数据会被破坏

我相信这是因为对齐,我读过其他帖子

但是,我仍然没有完全理解如何正确地将对齐设置为我的结构。另外,我不完全理解对齐和压缩限定符的属性

因此:

问题1。你能告诉我如何使我的结构正常工作吗

问题2。你能给我解释一下或者给我一些链接来理解所有的对齐问题和限定符吗


Thanx.

我建议先声明最宽的类型,再声明最窄的类型。首先,这可以避免由于对齐而浪费未使用的空间。其次,这通常可以避免在不同设备上进行不同对齐时出现的任何问题

所以


另外,要注意float3类型;它通常是GPU上的float4,如果主机端布局没有这样做,那么您的对齐将关闭。您可以切换到float4来避免这种情况。

Thanx,这很有帮助。我还读到,出于对齐的原因,需要使结构的大小为2的幂,因此我添加了一些伪变量,使其占用256字节,现在它可以工作:)。
typedef struct{
    float3 nextPos;
    float value;
    bool moved;
    bool nextMoved;
    int movePriority;
    int nextMovePriority;
    float value2;
    float value3;
    int neighbors[6];
    float3 offsets[6];
    float off1[6];
    float off2[6];
} ss;
struct ss{
    cl_float3 pos;
    cl_float3 offsets[6];
    cl_float value;
    cl_float value2;
    cl_float value3;
    cl_float off1[6];
    cl_float off2[6];
    cl_int movePriority;
    cl_int nextMovePriority;
    cl_int neighbors[6];
    cl_bool moved;
    cl_bool nextMoved;
};