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