gpt4 book ai didi

cuda - 与第 3 方 CUDA 库链接会减慢 cudaMalloc 的速度

转载 作者:行者123 更新时间:2023-12-03 05:35:55 28 4
gpt4 key购买 nike

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

最近,我注意到奇怪的行为:cudaMalloc 的运行时间直接取决于我的程序链接了多少个 3rd-party 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,所以这不是由某些原因引起的库初始化例程..

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

最佳答案

在您的示例中,cudaMalloc 调用在 GPU 上启动惰性上下文建立。当包含运行时 API 库时,必须检查它们的二进制有效负载,并将它们包含的 GPU elf 符号和对象合并到上下文中。库越多,该过程所需的时间就越长。此外,如果任何 cubins 中存在架构不匹配,并且您有向后兼容的 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 调用几乎免费。

关于cuda - 与第 3 方 CUDA 库链接会减慢 cudaMalloc 的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11664627/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com