Compilation CUDA多GPU内核编译

Compilation CUDA多GPU内核编译,compilation,cuda,nvcc,pycuda,multi-gpu,Compilation,Cuda,Nvcc,Pycuda,Multi Gpu,当编译在多个设备上启动内核的CUDA程序时,nvcc是否在内部为每个设备编译内核版本 我问这个问题是因为我正在尝试使用PyCUDA,并且正在为为什么我必须编译(调用SourceModule)每个我将要启动内核的设备的内核代码而苦苦挣扎 谢谢你的帮助 一个词的答案是否定的。编译器不知道或不需要知道任何关于编译期间GPU数量的信息。运行时API将自动将代码从二进制有效负载加载到每个上下文中,而无需编译器或程序员执行任何操作。如果代码需要JIT重新编译,那么驱动程序将编译一次,如果硬件目标相同,则缓存

当编译在多个设备上启动内核的CUDA程序时,nvcc是否在内部为每个设备编译内核版本

我问这个问题是因为我正在尝试使用PyCUDA,并且正在为为什么我必须编译(调用SourceModule)每个我将要启动内核的设备的内核代码而苦苦挣扎


谢谢你的帮助

一个词的答案是否定的。编译器不知道或不需要知道任何关于编译期间GPU数量的信息。运行时API将自动将代码从二进制有效负载加载到每个上下文中,而无需编译器或程序员执行任何操作。如果代码需要JIT重新编译,那么驱动程序将编译一次,如果硬件目标相同,则缓存的机器代码将在后续上下文中重用


在PyCUDA中,您使用的是驱动程序API,因此上下文管理更为手动。您必须将模块加载到正在使用的每个GPU的上下文中。如果您使用的是源模块功能,这意味着您需要提交每个GPU的代码。但是(IIRC),PyCUDA也使用nvcc对其JIT编译代码进行缓存。因此,即使需要为每个上下文调用源模块,如果GPU相同,也不应该每次都调用编译器。如果这困扰着你,你没有做很多元编程,考虑切换到预先编译的CubNs。您仍然需要将它们加载到每个上下文中,但在运行时没有编译开销。

一个词的答案是否。编译器不知道或不需要知道编译期间GPU的数量。运行时API将自动将代码从二进制有效负载加载到每个上下文中,而无需编译器或程序员执行任何操作。如果代码需要JIT重新编译,那么驱动程序将编译一次,如果硬件目标相同,则缓存的机器代码将在后续上下文中重用

在PyCUDA中,您使用的是驱动程序API,因此上下文管理更为手动。您必须将模块加载到正在使用的每个GPU的上下文中。如果您使用的是源模块功能,这意味着您需要提交每个GPU的代码。但是(IIRC),PyCUDA也使用nvcc对其JIT编译代码进行缓存。因此,即使需要为每个上下文调用源模块,如果GPU相同,也不应该每次都调用编译器。如果这困扰着你,你没有做很多元编程,考虑切换到预先编译的CubNs。您仍然需要将它们加载到每个上下文中,但在运行时没有编译开销