IADD.X GPU指令

IADD.X GPU instruction

查看为 NVIDIA Fermi 架构生成的 SASS 输出时,观察到指令 IADD.X。来自NVIDIAdocumentation,IADD是integer add的意思,但是不明白IADD.X是什么意思。有人可以帮忙吗...这是否意味着具有扩展位数的整数加法?

指令片段是:

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

是的,.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