【发布时间】:2016-02-13 22:53:41
【问题描述】:
我想我在使用有符号整数在 cuda PTX 中进行 128 位有符号乘法时发现了一个问题。 这是我的示例代码:
long long result_lo, result_hi;
asm(" mul.lo.s64 %0, 0, -1; \n\t" // 0 * -1 = 0
" mul.hi.s64 %1, 0, -1; \n\t"
: "=l"(result_lo), "=l"(result_hi));
这应该会产生结果result_lo = 0x0, result_hi = 0x0。然而,这会产生结果:result_lo = 0x0, result_hi = 0xFFFFFFFFFFFFFFFF 如果我没有记错并且显然不是零,这实际上是值 2^127 - (2^126 - 1)。
首先,我想确保我的理解是正确的,但是,有没有办法解决这个问题?
更新从Debug mod 更改为Release 模式修复了这个问题,仍然想知道这是否是 cuda 中的错误?
更新 2 将此错误报告给 NVIDIA
在 Visual Studio 2013 中使用了 Cuda 工具包 7.5。x64 Debug、sm_52、compute_52。
【问题讨论】:
-
这可能是
sm_52的调试模式下的错误。我可以在sm_52调试模式下重现它,但不能在sm_35或sm_20上重现。请注意,maxwell 设备没有原生 64 位整数乘法运算;编译器生成 32 位操作序列。因此this 可能会引起人们的兴趣。 -
@RobertCrovella 由于 sm_5x(相对于 sm_2x,sm_3x)在硬件中甚至没有 32 位整数乘法器,所以 sm_5x 上 64 位整数乘法的仿真序列必然与仿真不同用于 sm_2x、sm_3x 的序列。一个特定于 sm_5x 的错误报告似乎是有序的。
-
是的,我已经提交了一个错误。
-
作为一种解决方法,您需要确保 PTXAS 优化级别至少为
-O1。在 PTXAS 优化级别-O0(用于调试构建),正在为sm_5x目标发出错误的仿真序列(FWIW,这个仿真序列看起来不像我期望的那样)。所以尝试使用-Xptxas -O1或更高版本进行构建。 -
@njuffa:如果您愿意添加它,那将是一个完美的答案。