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

Cuda 为什么我有一个;不支持未对齐的内存访问”;错误?,cuda,Cuda,我得到了一个“未对齐内存访问不支持的错误”,并在谷歌上搜索了一下 但没有明确的解释。 整个错误消息是: /c:\cuda\include\math_functions_dbl_ptx1.h(1308): Error: Unaligned memory accesses not supported 以下代码导致了错误: for (j = low; j <= high; j++) for(j=低;j理论 在许多计算机上(但不是英特尔IA32计算机或其相关计算机),如果要访问2字节数量(整数

我得到了一个“未对齐内存访问不支持的错误”,并在谷歌上搜索了一下 但没有明确的解释。 整个错误消息是:

/c:\cuda\include\math_functions_dbl_ptx1.h(1308): Error: Unaligned memory accesses not supported
以下代码导致了错误:

for (j = low; j <= high; j++)
for(j=低;j理论
在许多计算机上(但不是英特尔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
循环似乎不太可能是问题的根源。可能是代码接近这一点,但可能不是那一行

有可能您在某个地方遇到缓冲区过度写入问题,并且无意中修改了指针,修改后的指针会产生错误。但是,由于该行似乎不包含任何指针,因此不太可能是该行真正触发了问题。

在许多计算机上(但不是英特尔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
循环似乎不太可能是问题的根源。可能是代码接近这一点,但可能不是那一行


您可能在某个地方遇到了缓冲区过度写入问题,并且无意中修改了指针,而修改后的指针会产生错误。但是,由于该行似乎不包含任何指针,因此不太可能是该行实际触发了问题。

问题不会自行解决;您更改了som正如乔纳森所说,错误不太可能出现在这一行(特别是如果
j
high
和-
low
都是纯整数)我们将无法在查看更多代码方面提供更多帮助。问题不会自行解决;您更改了某些内容,而这些更改意味着问题不再出现。正如Jonathan所说,错误不太可能出现在这条线上(特别是当
j
和-大概-
是普通整数时)我们将无法提供更多的帮助来查看更多的代码。您的理论示例导致了对我用C编写的编译器进行调试的可怕闪回。ahhh.+1.很有趣。未登录内存错误的发生随版本规则文件(如NSlight、NVidia SDK等)的不同而不同。您的理论示例导致了对调试的可怕闪回正在为me.ahhh.+1.interest使用C编写编译器。未对齐内存错误的发生情况因NSight、NVidia SDK等版本规则文件而异。