【问题标题】:CUDA Multi-GPU Kernel CompilationCUDA多GPU内核编译
【发布时间】:2015-11-12 00:37:52
【问题描述】:

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

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

感谢您的帮助!

【问题讨论】:

    标签: compilation cuda nvcc pycuda multi-gpu


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-07
      • 2012-01-09
      相关资源
      最近更新 更多