有没有办法创建一个二维数组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]));
答案 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字节的正确对齐。但我认为它最接近你所要求的。