CUDA JIT 编译器是否执行设备 link 时间优化?

Does the CUDA JIT compiler perform device link-time optimization?

在CUDA 11.2引入device link-time optimization (DLTO)之前,保证向前兼容相对容易,不用太担心性能差异。您通常只创建一个包含 PTX 的 fatbinary,用于尽可能低的架构,并为您通常定位的特定架构创建 SASS。对于任何未来的 GPU 架构,JIT 编译器随后会将 PTX assemble 转换为针对该特定 GPU 架构优化的 SASS。

然而,现在,有了 DLTO,我不太清楚如何确保前向兼容性并保持这些未来架构的性能。

假设我 compile/link 一个应用程序使用 nvcc 并具有以下选项:

编译

-gencode=arch=compute_52,code=[compute_52,lto_52]
-gencode=arch=compute_61,code=lto_61

Link

-gencode=arch=compute_52,code=[sm_52,sm_61] -dlto

这将为 cc_52 创建一个包含 PTX 的胖二进制文件,sm_52sm_61 的 LTO 中间体,以及 link 时间优化的 SASS sm_52sm_61(或者至少在使用 cuobjdump -all 转储生成的 fatbin 部分时似乎是这种情况)。

假设以上是正确的,当应用程序在更高版本的 GPU 架构(例如 sm_70)上 运行 时会发生什么? JIT 编译器是否只是 assemble cc_52 PTX 而没有使用 link 时间优化(导致不太优化的代码)?或者它是否以某种方式 link LTO 中介使用 link 时间优化?有没有办法 determine/guide JIT 编译器在做什么?

根据 NVIDIA 员工在 CUDA forums 上的说法,答案是“还没有”:

Good question. We are working on support for JIT LTO, but in 11.2 it is not supported. So in the example you give at JIT time it will JIT each individual PTX to cubin and then do a cubin link. This is the same as we have always done for JIT linking. But we should have more support for JIT LTO in future releases.