【问题标题】:Linking with 3rd party CUDA libraries slows down cudaMalloc与第 3 方 CUDA 库链接会减慢 cudaMalloc
【发布时间】:2012-07-26 18:36:19
【问题描述】:

在 CUDA 4.x 上第一次调用 cudaMalloc 已经不是什么秘密了 速度可能慢得离谱(被报告了好几次),这似乎是 CUDA 驱动程序中的一个错误。

最近,我注意到奇怪的行为:cudaMalloc 的运行时间 直接取决于我链接到我的程序的第 3 方 CUDA 库的数量 (请注意,我不使用这些库,只需将我的程序与它们链接)

我使用以下程序运行了一些测试:

int main() {
  cudaSetDevice(0);
  unsigned int *ptr = 0;
  cudaMalloc((void **)&ptr, 2000000 * sizeof(unsigned int));   
  cudaFree(ptr);
return 1;
}

结果如下:

  • 链接:-lcudart -lnpp -lcufft -lcublas -lcusparse -lcurand 运行时间:5.852449

  • 链接:-lcudart -lnpp -lcufft -lcublas 运行时间:1.425120

  • 关联:-lcudart -lnpp -lcufft 运行时间:0.905424

  • 关联:-lcudart 运行时间:0.394558

根据'gdb',时间确实进入了我的cudaMalloc,所以它不是由一些引起的 库初始化例程..

我想知道是否有人对此有合理的解释?

【问题讨论】:

    标签: cuda gpgpu gpu


    【解决方案1】:

    在您的示例中,cudaMalloc 调用会在 GPU 上启动惰性上下文建立。当包含运行时 API 库时,必须检查它们的二进制有效负载,并将它们包含的 GPU 精灵符号和对象合并到上下文中。库越多,您预计该过程需要的时间就越长。此外,如果任何 cubin 中存在架构不匹配并且您拥有向后兼容的 GPU,它还可以触发目标 GPU 的设备代码的驱动程序重新编译。在一个非常极端的情况下,我看到一个与旧版本 CUBLAS 链接的旧应用程序在 Fermi GPU 上运行时需要 10 秒来加载和初始化。

    您可以通过像这样发出cudaFree 调用来显式强制建立惰性上下文:

    int main() {
        cudaSetDevice(0);
        cudaFree(0); // context establishment happens here
        unsigned int *ptr = 0;
        cudaMalloc((void **)&ptr, 2000000 * sizeof(unsigned int));   
        cudaFree(ptr);
      return 1;
    }
    

    如果您使用计时器分析或检测此版本,您应该会发现第一个 cudaFree 调用会消耗大部分运行时间,而 cudaMalloc 调用几乎是免费的。

    【讨论】:

    • 感谢@talomnies,确实在开头插入 cudaFree 会占用整个运行时间。我最初在 GT650M 显卡(Kepler 核心)上测试了这个程序,而在 Fermi GPU GTX580 上它需要更长的时间 - 大约 7 秒.. NVIDIA 仍然可以做一些事情来优化他们的上下文管理 - 7 秒的完整 CPU 工作负载似乎太多了
    • @asm: 试试 CUDA 5 看看它能做什么。现在工具链中有一个适当的设备代码链接器,因此运行时的一些开销可能会转移到编译和链接时间(或至少简化一点)。此外,如果您发现这回答了您的问题,您可能会接受它,以便将您的问题标记为已回答。
    • 请注意,在 CUDA 4.0 中,CUDA 初始化需要这么长时间的部分原因是驱动程序正在为统一虚拟寻址执行大量虚拟内存分配。
    • 另请注意,驱动程序会将 JIT 编译的内核缓存在磁盘上。如果你改变硬件,它必须重做工作,但就内核编译而言,第二次应该比第一次快很多。
    猜你喜欢
    • 2011-09-24
    • 2015-09-25
    • 1970-01-01
    • 2021-11-30
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    相关资源
    最近更新 更多