CUDA中的强制对齐?

时间:2013-03-27 05:58:48

标签: c cuda alignment nvidia

有没有办法创建一个二维数组a [] [],其中每个a [i]本身都被强制与CUDA中的其他数据类型对齐?

我想做这样的事情:

__shared__ unsigned char a[20][8];// where a[i] is aligned to 8-byte boundary;

double t=*((double *)(a[2]));

甚至可能是:

__shared__ unsigned char a[20][9];// where a[i] is aligned to 8-byte boundary;

double t=*((double *)(a[2]));

2 个答案:

答案 0 :(得分:1)

您在CUDA中显示的两个代码段都是非法的。

所有当前硬件都需要将类型对齐到字大小的边界。在您的示例中,只有来自a[0]a[8]a[16]等的读取才有效,因为硬件要求从8字节对齐的边界发生任何double读取。其他任何东西都会从设备产生运行时错误。即使您尝试使用结构,编译器也会通过填充强制执行对齐。如果您想要一个不同的有效对齐方式,该语言支持结构的__align__ specifier

这是一个冗长的说不的方式。

答案 1 :(得分:1)

使用联盟怎么样?

union my_union_type {
    char   a[8];
    double t;
};

my_union_type var[20];

char   a = var.a[2][3];
double t = var.t[2];

这不等同于你的第二个例子,因为(正如talonmies指出的那样)你的例子是非法的并且会产生无效的代码,而我的代码会在每个元素之后插入7字节的正确对齐。但我认为它最接近你所要求的。