2

構造のずれに悩まされてきました。関連する構造は次のとおりです。

struct Ray
{
    float4 origin;
    float4 dir;
    float len;
    float dummy [3];
};

struct RayStack
{
    struct Ray r [STACK_DEPTH];
    int depth [STACK_DEPTH];
    float refr [STACK_DEPTH];
    int top;
    float dummy [3];
};

ちなみに、STACK_DEPTHは4の倍数です。すべての構造体のサイズが16の倍数であり、内部のfloat4が整列した境界上にあることを確認するように注意しました。

問題は、ローカル変数として使用すると、構造体RayStackが整列されていないことです。

struct RayStack stack;
printf("stack: %p\n", &stack);

スタックアドレスは、16バイトで整列された構造の場合のように、0ではなく8で終わることになります。これにより、ATIカードがクラッシュします(ただし、IntelとnVidiaはそれに悩まされていません)。__attribute __((aligned(16)))を構造体(前後)とローカル変数定義に配置してみましたが、何も変わりません。実際、printfステートメントを追加すると問題が解決しましたが、方法はわかりません。

ローカル変数スタックが16バイト境界に配置されていることを確認し、ATIカードでのクラッシュを防ぐために離れていますか。

ありがとう!

4

1 に答える 1

0

構造体の配列は 16 バイト境界に揃える必要があることをご存知ですか?
「ダミー」配列とは何ですか? パディング?その場合、パディングに配列を使用しないでください。
Nvidia、ATI、および Intel での私の経験から、次の方法が最も安全な方法です。

struct Ray
{
    float4 origin;
    float4 dir;
    float len;
    float padding1;
    float padding2;
    float padding3;
};

struct RayStack
{
    struct Ray r[STACK_DEPTH];
    int depth[STACK_DEPTH];
    float refr[STACK_DEPTH];
    int top;
    float padding1;
    float padding2;
    float padding3;
};
于 2013-03-07T15:33:37.053 に答える