【问题标题】:What does the --abi-compile=yes option of CUDA ptxas do (which costs registers)?CUDA ptxas 的 --abi-compile=yes 选项有什么作用(需要寄存器)?
【发布时间】:2016-06-11 20:45:25
【问题描述】:

NVIDIA CUDA 的 PTX 优化汇编器 ptxas 具有以下选项:

--abi-compile <yes|no>                              (-abi)                      
        Enable/Disable the compiling of functions using ABI.
        Default value:  'yes'.

那是什么 ABI?当你禁用它时会发生什么? 似乎导致使用的寄存器更少,嗯...

(受this GTC 2011 presentation 启发的关于寄存器溢出的问题。)

【问题讨论】:

    标签: cuda gpgpu abi ptxas


    【解决方案1】:

    应用程序二进制接口描述了如何调用函数如何与库接口等。它允许例如有一个函数调用堆栈,例如可以从内核、链接库调用内核。所有这些功能都需要一些寄存器(管理堆栈帧)。 ABI 是现代软件工作的原因,程序员通常不能选择退出它们。

    您仍然可以关闭 abi(并保存一些寄存器),但请记住,将外部函数链接为 printf() 将不再起作用。

    Here 是关于ABI 和 ptxas官方 CUDA 文档的链接。它会回答你所有的问题。

    【讨论】:

    • 这似乎是在讨论 PTX 代码的差异,而不是它的编译方式。
    • 添加了一些关于 abi 的详细信息及其在寄存器方面的成本。希望这会有所帮助。 cuda工具链中关于abi实际实现的资源很少。
    • 所以本质上是 +2 个寄存器(每个函数?)来维护一个堆栈帧?
    • 我不确定 ABI 使用的寄存器的确切数量。编译和分析一堆基本示例并查看生成的 ptxas 将非常有指导意义(如果您愿意,我们可以尝试一起做)。无论如何,注册并且在最新设备中不再是问题,所以 abi 将是唯一的选择(-abi=no think 已被弃用)。
    • 举几个超越设备端的例子printf():几乎所有的C++特性都需要ABI,单独编译和链接需要ABI,回调(例如CUFFT)需要ABI。 ABI 限制寄存器的使用,例如定义为用于函数参数传递的寄存器,因此在某些情况下构建堆栈帧所需的寄存器可能超过两个。意见:NVIDIA 应该在引入 ABI(我认为是 CUDA 3.0)后不久就删除该编译器标志,因为关闭 ABI 以保存一些寄存器是一种黑客行为。
    猜你喜欢
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多