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: %pn", &stack);

堆栈地址最终以 8 结尾,而不是 0,因为我想要 16 字节对齐的结构。 这会导致ATI卡崩溃(尽管英特尔和nVidia不受其困扰)。 我尝试将__attribute__((aligned(16)))放置在结构(之前和之后)以及局部变量定义中,这不会改变任何东西。 实际上,添加 printf 语句解决了这个问题,尽管我不知道如何解决。

是否确保局部变量堆栈在 16 字节边界上对齐并停止 ATI 卡上的崩溃。

谢谢!

您知道结构中的数组必须与 16 字节边界对齐?
"虚拟"数组有什么用?填充?如果是这样,请不要使用数组进行填充.
根据我对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;
};

最新更新