Assembly 为什么CUDA PTX有clz但没有ctz,而CUDA标头有;假ffs“;但是没有fls?
PTX是一种中介表示,用于将C/C++GPU代码编译成单个微体系结构的SASS汇编语言。因此,它不应该被特定nVIDIA GPU微体系结构的实际指令集中的特定孔/间隙/侥幸/特质所阻碍 现在,PTX有一条指令用于计算寄存器中前导零的数量:。然而-它缺少相应的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
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