我收到了“未对齐的内存访问不支持错误”,并进行了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。 之前遇到过这种错误,但由此自行解决(我什么都没做)。
有人能解释一下这个问题吗?
答案 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
,它是一个接一个的。最后一行将给出一个未对齐的内存访问指针。
由于您尚未显示代码的声明,因此我们无法确定导致问题的原因(尽管您确实说j
和high
是int
个变量;没有评论关于low
)。实际上,几乎与声明无关,引用for
循环似乎不太可能是问题的根源。它可能是接近的代码,但它可能不是那条线。
有可能在某处出现缓冲区覆盖问题并且意外修改指针,并且修改后的指针会生成错误。但是,由于该行似乎不包含任何指针,因此实际上不太可能触发该行。