2013-06-28 27 views
3

我有以下结构:如何为OpenCL数组的结构设置正确的对齐方式?

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

的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的缓冲液,但是当我操作与他们在一个内核中,数据被破坏。

我相信这是因为对齐的,我已阅读其他职位吧

I need help understanding data alignment in OpenCL's buffers

Aligning for Memory Accesses in OpenCL/CUDA

不过,我仍然没有完全得到如何正确设置的想法对齐到我的结构。此外,我不完全了解属性对齐和压缩限定符。

所以:

Q1。你能告诉我如何对齐我的结构正常工作吗? Q2302。你能解释我还是给我一些链接来理解所有的对齐问题和限定符?

感谢名单。

回答

3

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

所以,

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

+1

Thanx,那帮助。我还指出,出于对齐的原因,您需要使结构体具有2的大小,所以我添加了一些虚拟变量以使其占用256个字节,现在它可以工作:)。 – Alex

相关问题