1、探求 NVIDIA GPU 极限性能的利器
在通常的 CUDA 编程中,用户主要通过 CUDA C/C++ 或 python 语言实现 CUDA 功能的调用。在 NVIDIA 对 CUDA C
的官方支持工具链中,CUDA 设备端代码从 CUDA C 转换为 NVVM IR(类似 LLVM IR),再生成对应架构的 ptx,最后由 ptxas编译生成最终设备端的机器码。这其中CUDA C、NVVM IR 和 PTX都有相对完整的工具和文档支持。但对于最终生成的设备上运行的汇编(称为Streaming ASSembly,SASS)及其机器码,却没有提供类似 gcc 的gas 和 llvm 的 llvm-mc这种汇编工具。这就意味着最终代码生成质量将更多取决于编译器,而用户对底层汇编缺乏直接控制手段,从而限制功能使用和性能发挥。
CuAssembler 是个 CUDA SASS 汇编器,主要是把 nvdisasm 生成的反汇编输出汇编成可加载执行的 cubin文件,实现对最终汇编机器码的绝对控制,弥补当前 NV 没有官方汇编器支持的不足。
同类工具里有asfermi,KeplerAs,maxas,turingas等针对特定 NV 架构的汇编工具。与这些工具相比,CuAssembler
对多架构的支持更完整(当前主要有 SM60/SM61/SM70/SM75/SM80/SM86),指令编码支持和扩展也更容易。同时,CuAssembler能更好地嵌入现有 NVIDIA 官方工具链,可以实现大部分代码的功能继承自原有编译流程,从而支持更多 CUDA feature。
原作者: 杨仍才
更多回帖