2
我一直有一個錯位結構的麻煩。這裏所涉及的結構:ATI/AMD OpenCL的局部變量對齊
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);
堆棧地址結束了在8結束,而不是0作爲我希望爲16字節對齊結構體。這會導致ATI卡崩潰(儘管Intel和nVidia不會爲此感到困擾)。我已經嘗試將__attribute __((aligned(16)))放置在結構中(之前和之後)以及局部變量定義中,並且不會更改任何內容。實際上,添加printf語句可以解決問題,但我不知道如何。
是否確保局部變量堆棧在16字節邊界上對齊,並停止ATI卡上的崩潰。
謝謝!
更新:我剛剛發現問題消失在12.8驅動程序。我認爲12.10驅動程序在編譯器中出了點問題。 – Cthutu