2

CUDA Compiler Driver NVCC - 用于指导 GPU 代码生成的选项对我来说是模棱两可的:

小于 ABI 要求的最小寄存器的值将被编译器提高到 ABI 最小限制。

__global__ABI 是否对使用的寄存器数量和__device__功能有任何标准或限制?

4

1 回答 1

3

我认为(现在找不到参考)CUDA ABI 至少需要 16 个寄存器。因此,如果您指定较低的寄存器计数(例如,使用 -maxrregcount),编译器会将指定的限制提高到 ABI 要求的最小值,并打印一条建议消息,说明它这样做了。至于每个线程可用的 32 位寄存器的最大数量,取决于 GPU 架构:sm_1x 有 124 个寄存器,sm_2x 有 63 个寄存器,sm_3x 有 254 个寄存器。

一般而言,ABI(应用程序二进制接口)是针对存储布局、向函数传递参数、将函数结果返回给调用者等架构的特定约定。ABI(包括 x86_64、ARM)通常为特定任务指定特定寄存器例如堆栈指针、函数返回值、函数参数等。由于 GPU 架构允许每个线程使用可变数量的寄存器,因此使用 ABI 需要存在最少数量的寄存器来填充这些定义的角色。如果我没记错的话,CUDA 引入了 3.0 版的 ABI,这是第一个支持 Fermi 级 GPU 的版本。

ABI 需要计算能力 2.0 或更高。较旧的 GPU 架构缺乏 ABI 所需的硬件功能。大多数较新的 CUDA 功能,例如设备端 printf() 和 malloc(),调用函数,单独编译等都依赖并需要使用 ABI,并且它默认用于编译器生成的 sm_20 代码和多于。您可以通过 -Xptxas -abi=no 禁用 ABI。我强烈建议不要这样做。

于 2013-03-01T18:50:48.987 回答