来自作者cloudcore的介绍:
在通常的 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。
CuAssembler 的主要使用场景有两类。
一是性能敏感算子(如 conv、gemm 等)的汇编级的极致优化。由于汇编是设备运行的最终代码,使用汇编可以支持最细粒度的性能调优。第二个场景是通过一些特定汇编代码实现 microbenchmarking,测试指令集及微架构的性能信息,从而为程序性能优化提供参考。
从GitHub仓库可以看到,这个项目最早2年前已经在作者个人仓库中开源,这次是归入了OpenPPL之下。
内容中包含的图片若涉及版权问题,请及时与我们联系删除
评论
沙发等你来抢