PTX 是一种中间表示,用于将 C/C++ GPU 代码最终编译为单个微架构的 SASS 汇编语言。因此,它不应该受到特定 nVIDIA GPU 微架构的实际指令集中的特定孔/gaffs/flukes/特质的阻碍。
现在,PTX 有一条指令用于计算寄存器中前导零的数量:clz
. 然而 - 它缺少相应的ctz
指令,该指令计算尾随零的数量。这些操作是“对称的”,人们肯定会期望在指令集中看到两者或一个都没有——同样,特别是如果它是抽象的并且不受特定硬件上可用的东西的约束。流行的 CPU 架构已经拥有这两种架构多年了。
奇怪的是,CUDA 标头device_functions.h
声明了函数
* \brief Find the position of the least significant bit set to 1 in a 32 bit integer.
*
* [etc.]
*
* \return Returns a value between 0 and 32 inclusive representing the position of the first bit set.
* - __ffs(0) returns 0.
*/
__DEVICE_FUNCTIONS_DECL__ __device_builtin__ int __ffs(int x);
这个功能:
- 具有与计数尾随零几乎相同的语义 - 仅在全零输入上有所不同。
- 不会转换为单个 PTX 指令,而是两个:按位否定,然后是
clz
. - 也错过了它的潜在对手,
__fls
- 找到最后一组。
那么,这是为什么呢?为什么 PTX 中缺少一个明显显而易见的指令,以及一个与标题中几乎相同的“假内置”?