PTX ISA中的错误(进位传播)?

时间:2013-08-09 15:47:57

标签: cuda ptx

Cuda有错误吗?我在GTX580上运行了以下代码,最后r1为零。我希望它是一个由于传播?我已经使用Cuda Toolkit 4.2.9和5.5测试了代码,并使用“nvcc -arch = sm_20 bug.cu -o bug&& ./bug”来编译和运行它。

#include <stdio.h>
#include <cuda.h>

__global__ void bug()
{
  unsigned int r1 = 0;
  unsigned int r2 = 0;

  asm( "\n\t"
       "sub.cc.u32 %0, 0, 1;\n\t"
       "addc.cc.u32 %1, 0, 0;\n\t"
     : "=r"(r1), "=r"(r2) );

  printf("r1 >> %04X\n", r1);
  printf("r2 >> %04X\n", r2);

}

int main(void)
{
  float *a_d;
  cudaMalloc((void **) &a_d, 1);

  bug <<< 1,1 >>> ();

  cudaFree(a_d);
}

Output
r1 >> FFFFFFFF
r2 >> 0000

2 个答案:

答案 0 :(得分:3)

我相信您对PTX ISA documentation中引用的可能无效的CC.CF标记做了一些假设。

请注意,我从未给出该位的特定状态(例如0或1)的定义。此外,我没有找到“结转/结转”和“借入/借出”的定义之间的任何映射

换句话说,我认为你假设这个标志中的“借用”状态与“进位”状态相同。换句话说,你假设的是:

CF:  
0    =  (NO CARRY) or (NO BORROW)
1    =  (CARRY) or (BORROW)

但是从未给出过这样的真值表或映射。此外,手册指出:

  

条件代码寄存器...主要用于直线代码序列,用于计算扩展精度整数加法,减法和乘法。

我认为您的代码不满足意图,我认为CC.CF的上述真值表假设也无效。

事实上,我认为正在发生的是这样的真值表:

CF:  
0    =  (CARRY) or (NO BORROW)
1    =  (NO CARRY) or (BORROW)

(这里的0和1是任意的;手册中也没有定义。)

我尝试的所有代码示例(大约6个案例,包括你的代码)都符合我上面给出的定义。

说完这个之后,我认为依靠这个是不明智的,因为它几乎没有记录。计算机体系结构的安全规则是未来的未记录行为可能会发生变化。

答案 1 :(得分:-1)

我想我找到了解释。对于sub.cc指令,PTX手册中有一个注释:“对于无符号和有符号整数,行为是相同的。”