Assembly 为什么CUDA PTX有clz但没有ctz,而CUDA标头有;假ffs“;但是没有fls?

Assembly 为什么CUDA PTX有clz但没有ctz,而CUDA标头有;假ffs“;但是没有fls?,assembly,cuda,ptx,Assembly,Cuda,Ptx,PTX是一种中介表示,用于将C/C++GPU代码编译成单个微体系结构的SASS汇编语言。因此,它不应该被特定nVIDIA GPU微体系结构的实际指令集中的特定孔/间隙/侥幸/特质所阻碍 现在,PTX有一条指令用于计算寄存器中前导零的数量:。然而-它缺少相应的ctz指令,该指令对尾随零的数字进行计数。这些操作是“对称”的,人们当然希望在一个指令集中同时看到这两个操作或一个都没有,尤其是当它是抽象的并且没有绑定到特定硬件上可用的操作时。流行的CPU架构多年来都有这两种功能 奇怪的是,CUDA头dev

PTX是一种中介表示,用于将C/C++GPU代码编译成单个微体系结构的SASS汇编语言。因此,它不应该被特定nVIDIA GPU微体系结构的实际指令集中的特定孔/间隙/侥幸/特质所阻碍

现在,PTX有一条指令用于计算寄存器中前导零的数量:。然而-它缺少相应的
ctz
指令,该指令对尾随零的数字进行计数。这些操作是“对称”的,人们当然希望在一个指令集中同时看到这两个操作或一个都没有,尤其是当它是抽象的并且没有绑定到特定硬件上可用的操作时。流行的CPU架构多年来都有这两种功能

奇怪的是,CUDA头
device\u 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
  • 也缺少潜在的对应项,
    \uu fls
    -查找最后一组

那为什么呢?为什么PTX中明显缺少指令,而标题中出现了与之几乎相同的“假内置”指令?

一般来说,与x86体系结构一样,CUDA和GPU体系结构的许多功能都是根据客户反馈和需求有机积累的,而不是起源于某种宏大的统一正交设计

我个人向CUDA添加了
\uu ffs()
\uu ffsll()
设备函数内部函数。之所以包括它们,是因为它们表示有用的位操作原语,并且与POSIX定义的
ffs()
功能完全匹配

对于位操作,特别是对于定点操作和浮点模拟的实现,
CLZ
是比
CTZ
重要得多的操作。最初,我在CUDA中将
\uuuuCLZ()
\uuuCLZ()
实现为短模拟序列。后来添加了对
CLZ
的硬件支持。我不是硬件体系结构团队的一员,但我有理由相信该说明是根据客户反馈添加的

PTX的主要目标之一是以抽象形式公开底层硬件功能,因为每一代GPU都会对硬件的实际微体系结构进行重大更改。此虚拟ISA旨在作为本机指令集的薄包装器。本机GPU指令集非常小。例如,没有关于分区的说明。简单的硬件使芯片面积更小,芯数更高

为了为现有的编译器提供一个实用的目标(CUDA使用了Open64和LLVM工具链),一些更高级别的操作被添加到了PTX中,尽管缺乏底层硬件支持。由于这是一个软件支持负担,因此可能没有什么动机来增加更多这样的操作。并非所有现有的仿真都具有最高的性能。在NVIDIA任职期间,我致力于优化最重要的PTX操作的仿真序列


CUDA用户可以通过bug报告机制提交增强请求(例如将
CTZ
作为PTX操作包含在内)。

一般来说,与x86体系结构一样,CUDA和GPU体系结构的许多功能已经根据客户反馈和需求有机地积累起来,而不是起源于某种宏大的统一正交设计

我个人向CUDA添加了
\uu ffs()
\uu ffsll()
设备函数内部函数。之所以包括它们,是因为它们表示有用的位操作原语,并且与POSIX定义的
ffs()
功能完全匹配

对于位操作,特别是对于定点操作和浮点模拟的实现,
CLZ
是比
CTZ
重要得多的操作。最初,我在CUDA中将
\uuuuCLZ()
\uuuCLZ()
实现为短模拟序列。后来添加了对
CLZ
的硬件支持。我不是硬件体系结构团队的一员,但我有理由相信该说明是根据客户反馈添加的

PTX的主要目标之一是以抽象形式公开底层硬件功能,因为每一代GPU都会对硬件的实际微体系结构进行重大更改。此虚拟ISA旨在作为本机指令集的薄包装器。本机GPU指令集非常小。例如,没有关于分区的说明。简单的硬件使芯片面积更小,芯数更高

为了为现有的编译器提供一个实用的目标(CUDA使用了Open64和LLVM工具链),一些更高级别的操作被添加到了PTX中,尽管缺乏底层硬件支持。由于这是一个软件支持负担,因此可能没有什么动机来增加更多这样的操作。并非所有现有的仿真都具有最高的性能。在NVIDIA任职期间,我致力于优化最重要的PTX操作的仿真序列


CUDA用户可以通过bug报告机制提交增强请求(例如将
CTZ
作为PTX操作包含在内)。

尽量减少无谓的标签创建。标记用于搜索和问题分类,而不是俳句。@talonmies:(1)关于计数尾随零的标记(不仅仅是在CUDA中)似乎是合理的。(2) 我希望这不是你投否决票的原因。至少ARM没有
ctz
,但有
clz
。数n