ABI如何定义GPU中的寄存器数量?

时间:2013-03-01 15:09:33

标签: cuda

CUDA Compiler Driver NVCC - Options for steering GPU code generation中有一行对我来说不明确:

  

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

ABI对__global____device__函数使用的寄存器数量有任何标准或限制吗?

1 个答案:

答案 0 :(得分: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的使用。我强烈建议不要这样做。