IADD.X GPU指令

时间:2016-05-26 15:02:37

标签: cuda gpu nvidia

当查看为NVIDIA Fermi架构生成的SASS输出时,会观察到IADD.X指令。从NVIDIA documentation开始,IADD表示整数加法,但不理解IA​​DD.X的含义。有人可以帮忙......这是否意味着一个带有扩展位数的整数加法?

说明摘要是:

IADD.X R5, R3, c[0x0][0x24];   /* 0x4800400090315c43 */

1 个答案:

答案 0 :(得分:2)

是的,.X代表扩展精度。您将看到IADD.XIADD.CC一起使用,后者添加较低有效位,并生成进位标志(因此.CC),然后将此进位标志合并到另外由IADD.X执行的更重要的比特。

由于NVIDIA GPU基本上是具有64位寻址能力的32位处理器,因此在地址(指针)算法中经常使用这种习惯用法。使用64位整数类型(例如long long intuint64_t)同样会导致使用这些指令。

这是一个内核进行64位整数加法的工作示例。此CUDA代码是使用CUDA 7.5编译的计算能力3.5,以及使用cuobjdump --dump-sass转储的机器代码。

__global__ void addint64 (long long int a, long long int b, long long int *res)
{
    *res = a + b;
}

MOV     R1, c[0x0][0x44];         
MOV     R2, c[0x0][0x148];        // b[31:0]
MOV     R0, c[0x0][0x14c];        // b[63:32]
IADD    R4.CC, R2, c[0x0][0x140]; // tmp[31:0] = b[31:0] + a[31:0]; carry-out
MOV     R2, c[0x0][0x150];        // res[31:0]
MOV     R3, c[0x0][0x154];        // res[63:32]
IADD.X  R5, R0, c[0x0][0x144];    // tmp[63:32] = b[63:32] + a[63:32] + carry-in
ST.E.64 [R2], R4;                 // [res] = tmp[63:0]
EXIT