CUDA 中的“注册”关键字

Posted

技术标签:

【中文标题】CUDA 中的“注册”关键字【英文标题】:"register" keyword in CUDA 【发布时间】:2015-02-18 21:24:25 【问题描述】:

我有一个大型程序,它使用我为每个线程分配的所有寄存器 (64) 并溢出到本地内存。我希望能够告诉编译器哪些变量应该不惜一切代价保留在寄存器中,哪些变量我并不真正关心。 “注册”C/C++ 关键字在 nvcc 中有效吗?可能有不同的机制吗?

谢谢!

【问题讨论】:

【参考方案1】:

如果您愿意,可以在 CUDA C/C++ 中使用 register。在任何情况下,这只是对编译器的提示。它可能会被忽略。没有任何声明保证它会做任何事情。

我认为这些陈述对于register 的大多数语言实现来说都是正确的。

我还认为编译器很可能在决定寄存器中的内容和适当的优先级方面做得比您做得更好。

用于控制寄存器使用的典型 CUDA C/C++ 机制在更高级别工作,它们是:

    -maxrregcountcompile switch launch bounds 指令。

【讨论】:

正如 Roberr Crovella 所说,在寄存器分配方面,任何现代 C/C++ 工具链(包括基于 CUDA 的 C++ 工具链)都几乎忽略了 register 关键字,因为它们都有复杂的寄存器内置分配机制。编译器可能不允许使用具有register 属性的变量的地址。 谢谢,我就是这么想的。 我也认为编译器很可能比你更好地决定寄存器中的内容和适当的优先级。 不幸的是它不能(计算路径在很大程度上取决于数据),它的选择很差。我可以通过手动将变量驱逐到全局内存中来显着提高性能。不幸的是,这意味着我在 CC3.5 上失去了 L1 缓存的好处(并且编程合并访问变得很麻烦)。 @Robert Crovella, njuffa 因此,除了在汇编中编写对这些变量的所有访问之外,没有确定的解决方案(我从未在 CUDA 中这样做过——这甚至是一种选择吗?)。 @AMMC:问题是,在PTX ISA 5.1.1. Register State Space 我发现了以下内容:Registers (.reg state space) are fast storage locations. The number of registers is limited, and will vary from platform to platform. When the limit is exceeded, register variables will be spilled to memory, causing changes in performance. 所以看起来即使我写了手写的 PTX,我仍然无法控制它。我错过了什么吗? PTX 是一个中间码。它没有以任何保证的方式规定寄存器的使用。它仍然经过编译步骤(通过 ptxas 或等效的驱动程序运行时)。我不知道有什么方法可以锁定或规定特定的寄存器用法,也没有办法使用任何 NVIDIA 提供的工具直接编写 CUDA 代码是 SASS(GPU 汇编代码)。

以上是关于CUDA 中的“注册”关键字的主要内容,如果未能解决你的问题,请参考以下文章

CUDA GPU处理。TypeError: compile_kernel()得到了一个意外的关键字 "boundscheck"。

SURF_CUDA 每次执行计算不同的关键点

“注册”是 Ksql 中的保留关键字,如果是,我如何选择具有该名称的字段

CUDA 编程的基本模式

在 Windows 上安装 CUDA

CUDA线程索引计算