構造のずれに悩まされてきました。関連する構造は次のとおりです。
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カードでのクラッシュを防ぐために離れていますか。
ありがとう!