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