2012-12-11 44 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; 
};