3

我有以下结构:

C++:

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];
};

开放式CL:

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 缓冲区,但是当我在内核中使用它们时,数据被破坏了。

我相信这是因为对齐,我已经阅读了其他关于它的帖子

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

在 OpenCL/CUDA 中对齐内存访问

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

所以:

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

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

谢谢。

4

1 回答 1

4

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

所以,

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 以避免这种情况。

于 2013-06-28T23:07:33.673 回答