关于GPU编程:如何为OpenCL结构数组设置正确的对齐方式?

How to set the right alignment for an OpenCL array of structs?

我有以下结构:

C ++:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct ss{
    cl_float3 pos;
    cl_float value;
    cl_bool moved;
    cl_bool nextMoved;
    cl_int movePriority;
    cl_int nextMovePriority;
    cl_float value2;
    cl_float value3;
    cl_int neighbors[6];
    cl_float3 offsets[6];
    cl_float off1[6];
    cl_float off2[6];
};

OpenCL:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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 Buffer,但是当我在内核中对其进行操作时,数据将被破坏。

我相信这是由于对齐,我已经阅读了有关它的其他文章

我需要帮助来了解OpenCL缓冲区中的数据对齐方式

在OpenCL / CUDA中对齐内存访问

但是,我仍然没有完全了解如何正确设置结构的对齐方式。 另外,我也不完全了解属性对齐和打包的限定符。

所以:

Q1。 您能告诉我如何调整我的结构以使其正常工作吗?

Q2。 您能解释一下还是给我一些链接,以了解所有对齐问题和限定词?

谢谢


我建议声明您的结构,从最宽的类型到最窄的类型。 首先,这避免了由于对齐而浪费未使用的空间。 其次,这通常可以避免在不同设备上使用不同的对齐方式时会头疼。

所以,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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;
};

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