【问题标题】:Why do I have an "unaligned memory accesses not supported" error?为什么会出现“不支持未对齐的内存访问”错误?
【发布时间】:2010-09-10 14:14:24
【问题描述】:

我收到“不支持未对齐的内存访问错误”并在 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。 以前遇到过这种错误,但自己解决了(我什么都没做)。

谁能解释一下这个问题?

【问题讨论】:

  • 问题无法自行解决;你改变了一些东西,而这种改变意味着问题不再出现。
  • 正如乔纳森所说,错误不太可能出现在该行(特别是如果jhigh 和 - 大概 - low 是纯整数),我们将无法提供更多帮助以查看更多代码。

标签: cuda


【解决方案1】:

理论

在许多机器上——但不是 Intel 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 循环似乎不太可能是问题的根源。它可能是接近那个的代码,但它可能不是那一行。

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

【讨论】:

  • 您的理论示例为我调试用 C 编写的编译器引起了可怕的闪回。啊。 +1。
  • 有趣。未对齐的内存错误发生率因版本规则文件(例如 NSight、NVidia SDK 等)而异。
猜你喜欢
  • 2011-08-09
  • 1970-01-01
  • 2018-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多