CUDA多GPU内核编译
CUDA Multi-GPU Kernel Compilation
当编译在多个设备上启动内核的 CUDA 程序时,nvcc 是否在内部为每个设备编译一个版本的内核?
我问这个是因为我正在尝试使用 PyCUDA 并且正在努力解决为什么我必须编译(调用 SourceModule)我将要在其上启动内核的每个设备的内核代码。
感谢您的帮助!
一个词的答案是否定的。编译器在编译期间不知道或不需要知道任何关于GPU数量的信息。运行时 API 会自动将二进制有效负载中的代码加载到每个上下文中,而无需编译器或程序员做任何事情。如果您的代码需要 JIT 重新编译,驱动程序将编译一次,并且缓存的机器代码将在后续上下文中重用,前提是硬件目标相同。
在 PyCUDA 中,您使用的是驱动程序 API,因此上下文管理更加手动。您必须将模块加载到您正在使用的每个 GPU 的上下文中。如果您使用源模块功能,则意味着您需要为每个 GPU 提交代码。但是 (IIRC),PyCUDA 也确实缓存了它用 nvcc 完成的 JIT 编译代码。因此,即使您需要为每个上下文调用源模块,如果 GPU 相同,您也不应该每次都调用编译器。如果这让您感到困扰并且您没有进行大量的元编程,请考虑切换到预编译的 cubins。您仍然需要将它们加载到每个上下文中,但在运行时没有编译开销。
当编译在多个设备上启动内核的 CUDA 程序时,nvcc 是否在内部为每个设备编译一个版本的内核?
我问这个是因为我正在尝试使用 PyCUDA 并且正在努力解决为什么我必须编译(调用 SourceModule)我将要在其上启动内核的每个设备的内核代码。
感谢您的帮助!
一个词的答案是否定的。编译器在编译期间不知道或不需要知道任何关于GPU数量的信息。运行时 API 会自动将二进制有效负载中的代码加载到每个上下文中,而无需编译器或程序员做任何事情。如果您的代码需要 JIT 重新编译,驱动程序将编译一次,并且缓存的机器代码将在后续上下文中重用,前提是硬件目标相同。
在 PyCUDA 中,您使用的是驱动程序 API,因此上下文管理更加手动。您必须将模块加载到您正在使用的每个 GPU 的上下文中。如果您使用源模块功能,则意味着您需要为每个 GPU 提交代码。但是 (IIRC),PyCUDA 也确实缓存了它用 nvcc 完成的 JIT 编译代码。因此,即使您需要为每个上下文调用源模块,如果 GPU 相同,您也不应该每次都调用编译器。如果这让您感到困扰并且您没有进行大量的元编程,请考虑切换到预编译的 cubins。您仍然需要将它们加载到每个上下文中,但在运行时没有编译开销。