【问题标题】:Local variable alignment for ATI/AMD OpenCLATI/AMD OpenCL 的局部变量对齐
【发布时间】:2012-12-11 15:35:20
【问题描述】:

我一直遇到结构未对齐的问题。以下是涉及的结构:

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 驱动程序破坏了编译器中的某些内容。

标签: opencl gpu memory-alignment ati amd-processor


【解决方案1】:

您知道结构中的 数组 必须与 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;
};

【讨论】:

    猜你喜欢
    • 2016-01-17
    • 1970-01-01
    • 2023-03-26
    • 2011-08-13
    • 2011-04-17
    • 1970-01-01
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多