为什么我有“不支持未对齐的内存访问”错误?

时间:2010-09-10 05:42:28

标签: cuda

我收到了“未对齐的内存访问不支持错误”,并进行了Google搜索 但没有明确的解释。 整个错误消息是:

/c:\cuda\include\math_functions_dbl_ptx1.h(1308): Error: Unaligned memory accesses not supported

以下代码导致错误:

for (j = low; j <= high; j++)

变量j和high声明为int。 之前遇到过这种错误,但由此自行解决(我什么都没做)。

有人能解释一下这个问题吗?

1 个答案:

答案 0 :(得分:3)

理论

在许多机器上 - 但不是英特尔IA32或其亲属 - 如果要访问2字节数量(整数),地址必须是偶数,而不是奇数;如果要访问4字节数量(整数或浮点数),则地址必须是4字节的倍数;如果要访问8字节数量(整数或双精度),则地址必须是8字节的倍数;等等。

然而,表面上看,你已经以某种方式让你的代码尝试取消引用一个指针,当你不应该在低位部分设置位。例如,强制问题的一种方法(在C中)将是:

long l = 0x12345678;
void *v = (char *)&l + 1;
long *lp = v;
l = *lp;

当你完成指针算术运算时,lp中的地址不是4字节(或8字节)对齐的;由于+1,它是一个接一个的。最后一行将给出一个未对齐的内存访问指针。

实践

由于您尚未显示代码的声明,因此我们无法确定导致问题的原因(尽管您确实说jhighint个变量;没有评论关于low)。实际上,几乎与声明无关,引用for循环似乎不太可能是问题的根源。它可能是接近的代码,但它可能不是那条线。

有可能在某处出现缓冲区覆盖问题并且意外修改指针,并且修改后的指针会生成错误。但是,由于该行似乎不包含任何指针,因此实际上不太可能触发该行。