2012-12-11 42 views
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卡上的崩潰。

謝謝!

+0

更新:我剛剛發現問題消失在12.8驅動程序。我認爲12.10驅動程序在編譯器中出了點問題。 – Cthutu

回答

0

你知道數組在結構必須對齊到一個16字節的邊界嗎?
什麼是「dummy」數組?填充?如果是這樣,不要使用數組來填充。
我與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; 
};