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