繁体   English   中英

不使用 NVCC 时是否使用 NVIDIA 的 JIT 编译缓存?

[英]Is NVIDIA's JIT compilation cache used when you don't use NVCC?

我们都应该知道(但没有足够多的人这样做),当您使用 NVCC 构建 CUDA 程序并在二进制文件中不包含特定设备的完全编译 (SASS) 代码的设备上运行它时 - 中间PTX 代码是 JITed,其结果实际上用于运行您的内核。 在这个 JITing 期间, JIT 编译缓存启动,因此,下次运行相同的可执行文件时,可以跳过编译而只加载结果。

现在,假设我正在编写 C++ 文件,它在运行时动态编译内核,而不是使用 NVCC,例如:

  1. 我使用 NVRTC 的nvrtcCompileProgram()编译 CUDA C++ 代码,针对具体架构(例如sm_70 )。
  2. 我使用 CUDA 驱动程序的cuModuleLoad()来使用内核加载 PTX 文件。

编译结果会放在那个缓存中吗?

您描述的缓存行为与 nvcc 或 nvrtc 无关。 运行时 JIT 编译代码的缓存是一种驱动程序级机制,主要用于实现新硬件与旧代码的兼容性。

使用运行时或驱动程序 API 运行 CUDA 代码以运行内核时,需要考虑三种情况:

  1. 应用程序向驱动程序提供兼容的 SASS(可以是运行时 API 应用程序中静态链接的有效负载,或从文件加载的 SASS,或使用 nvrtc 以物理架构作为目标发出的 SASS)。 在这种情况下,SASS 被加载并执行。 不涉及缓存。

  2. 该应用程序提供有效的 PTX 代码(在不存在兼容的 SASS 的情况下来自 fatbinary 有效负载,或者通过驱动程序 API 加载,无论该有效负载的来源是什么,在虚拟架构的情况下包括 nvrtc用作目标)。 在这种情况下,驱动程序触发 PTX 的 JIT 编译并加载结果 SASS 以执行。 这就是缓存发生的地方。 驱动程序将检查 JIT 输出的用户特定的私有缓存,如果它存在并且如果它找到与之前编译的 PTX 匹配,它会从缓存中检索 SASS 并使用它,而不是再次编译相同的 PTX。 可以通过将CUDA_CACHE_DISABLE设置为 1 来消除此机制。可以在此处找到有关此机制及其控件的更全面的讨论。 如果 PTX 无效,则会将无效(或不兼容)的 PTX 错误消息返回给调用者并且执行失败

  3. 该应用程序既不提供兼容的 SASS,也不提供 PTX。 在这种情况下,将向调用者返回 no binary for GPU(或其运行时 API 等效项)错误,并且执行失败。 在这种情况下,驱动程序 PTX 缓存不起作用。

所以对于你的两种情况:

我使用 NVRTC 的nvrtcCompileProgram()编译 CUDA C++ 代码,针对具体架构(例如sm_70 )。

在这种情况下,您属于上述第一种或第三种情况。 如果有效,二进制有效负载将被加载并执行,如果无效则失败并出现错误。 不发生缓存。

我使用 CUDA 驱动程序的 cuModuleLoad() 来使用内核加载 PTX 文件。

在这种情况下,案例 2 适用。 驱动程序会进行缓存检查,并重用缓存中先前的 JIT 传递输出,或者在发生缓存未命中时尝试执行 JIT 编译并缓存结果。 如果 PTX 有效且兼容,则内核运行。

根据我的经验观察,答案似乎是:

编译 使用 JIT 缓存?
针对具体架构的 NVRTC
NVRTC 瞄准“虚拟”架构 ???
使用 CUDA 驱动程序加载模块 是的

但是我没有对此进行过广泛的探索。 也许有更官方的保证。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM