如何理解 CUDA/GPU 中的 SASS 分析结果

Posted

技术标签:

【中文标题】如何理解 CUDA/GPU 中的 SASS 分析结果【英文标题】:How to understand the result of SASS analysis in CUDA/GPU 【发布时间】:2016-01-28 07:14:17 【问题描述】:

我使用 CUDA Binary Utilities 之一的 cuobjdump 来生成 SASS 代码,示例结果如下。这些代码尝试从全局内存中加载。

/*0028*/ IMAD R6.CC, R3, R5, c[0x0][0x20]; 
/*0030*/ IMAD.HI.X R7, R3, R5, c[0x0][0x24]; 
/*0040*/ LD.E R2, [R6]; //load

    我在哪里可以获得解释每条指令含义的 SASS 代码的完整手册。在“cuda 二进制实用程序”中,它只提供了对指令含义的一般解释。例如它没有解释“R1.cc”、“IMAD.HI.X”和LD.e的含义。

    第二条指令是什么意思。我猜第一条是计算每个线程应该加载的内存地址,而第三条指令是将全局内存加载到寄存器中。我不知道第二条指令的含义。

    我猜 cuda 会将一些参数信息,如网格大小、块大小和数组基址保存到常量内存中。 在这种情况下,c[0x0][0x20] 是数组的基地址。我的问题是如何获得这些信息。

【问题讨论】:

sass 标签用于名为 Sass 的 CSS 预处理器。 【参考方案1】:
    在哪里可以获得解释每条指令含义的 SASS 代码完整手册。

据我所知,没有这样的东西,SASS 大多是无证的(只有一个basic reference),因为它因架构而异。但是,PTX 是thoroughly documented,并且许多 SASS 指令具有接近的 PTX 等效项,您可以从中推断其含义。您可能还希望将 SASS 与源信息一起转储,以更好地了解发生了什么。

但是鉴于这两个文档,您可以或多或少地将 SASS 翻译回 PTX 并猜测指令的含义:

/*0028*/ IMAD R6.CC, R3, R5, c[0x0][0x20];

Extended-precision integer multiply-add:将 R3 与 R5 相乘,与 bank 0 中的常数相加,偏移量 0x20,存储在 R6 中并进行进位。

/*0030*/ IMAD.HI.X R7, R3, R5, c[0x0][0x24];

Integer multiply-add with extract:将 R3 与 R5 相乘,提取上半部分,将上半部分与存储区 0 中的常数相加,偏移量 0x24,带进位存储在 R7 中。

/*0040*/ LD.E R2, [R6]; //load

Load:将寄存器对 R7:R6 指向的内容加载到 R2。

作为@njuffa explains in the comment below:

整个计算将 R3 与 R5 相乘,将 64 位乘积与 c[0][24]:c[0][20] 中的 64 位常数相加,并使用得到的 64 位地址检索R2。

    我猜cuda会将一些参数信息,如网格大小、块大小和数组基址保存到常量内存中。 [...] 我的问题是如何获取这些信息。

内置函数(threadIdxblockIdxblockDimgridDim 等)所在的位置未指定,并且可能因架构而异。实际上,其中一些在专用寄存器中,另一些在共享内存中。但这是一个实现细节。

注意:已编辑以整合 @njuffa 的评论。

【讨论】:

小修正:将寄存器对 R7:R6 指向的内容加载到 R2 中。 .X 指定了一个带进位的 扩展 操作,我记得这个后缀最初是在摩托罗拉的 68K 系列中用于此目的。整个计算将 R3 与 R5 相乘,将 64 位乘积与 c[0][24]:c[0][20] 中的 64 位常数相加,并使用得到的 64 位地址检索 R2。

以上是关于如何理解 CUDA/GPU 中的 SASS 分析结果的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 NVIDIA 驱动程序/CUDA(支持 tensorflow-gpu)和带有 pip 的 Python3 为图像制作 Dockerfile?

Webpack2 不理解我的 SASS 文件中的 @import 语句(如何使用 webpack2 编译 SASS?)

CUDA(GPU) 作为 OpenCV 后端

使用异步内存传输的 CUDA CPU-GPU 回调

当块数很大时,CUDA GPU的结果令人惊讶

cuda GPU 编程之共享内存的使用