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

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 バッファーに渡しますが、カーネルでそれらを操作すると、データが破損します。

これはアラインメントによるものだと思います。それに関する他の投稿を読みました

OpenCL のバッファでのデータの配置を理解するのに助けが必要です

OpenCL/CUDA でのメモリ アクセスのアライメント

しかし、それでも、配置を構造体に適切に設定する方法が完全にはわかりません。また、属性の整列およびパックされた修飾子を完全には理解していません。

そう:

Q1. 構造体が正しく機能するように調整する方法を教えてください。

Q2. すべてのアライメントの問題と修飾子を理解するために、私に説明するか、リンクを教えてもらえますか?

ありがとう。

4

1 に答える 1

4

最初に最も広いタイプから最も狭いタイプまで、構造を宣言することをお勧めします。第 1 に、これにより、アラインメントによる無駄な未使用スペースが回避されます。第二に、これにより、さまざまなデバイスでのさまざまな配置による頭痛が回避されることがよくあります。

そう、

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 に答える