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