当查看为NVIDIA Fermi架构生成的SASS输出时,会观察到IADD.X指令。从NVIDIA documentation开始,IADD表示整数加法,但不理解IADD.X的含义。有人可以帮忙......这是否意味着一个带有扩展位数的整数加法?
说明摘要是:
IADD.X R5, R3, c[0x0][0x24]; /* 0x4800400090315c43 */
答案 0 :(得分:2)
是的,.X
代表扩展精度。您将看到IADD.X
与IADD.CC
一起使用,后者添加较低有效位,并生成进位标志(因此.CC
),然后将此进位标志合并到另外由IADD.X
执行的更重要的比特。
由于NVIDIA GPU基本上是具有64位寻址能力的32位处理器,因此在地址(指针)算法中经常使用这种习惯用法。使用64位整数类型(例如long long int
或uint64_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