首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >与第三方CUDA库的链接降低了cudaMalloc的速度

与第三方CUDA库的链接降低了cudaMalloc的速度
EN

Stack Overflow用户
提问于 2012-07-26 07:44:14
回答 1查看 1.3K关注 0票数 10

在CUDA 4.x上,第一次调用cudaMalloc的速度可能会非常慢(这是多次报告的),这似乎是CUDA驱动程序中的一个bug,这不是什么秘密。

最近,我注意到了奇怪的行为:cudaMalloc的运行时间直接取决于我将多少第三方CUDA库链接到我的程序(请注意,我没有使用这些库,只需将我的程序与它们链接)。

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

代码语言:javascript
运行
复制
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,所以它不是由某些库初始化例程引起的。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-26 08:46:26

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

通过发出如下cudaFree调用,可以显式强制延迟上下文建立:

代码语言:javascript
运行
复制
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调用几乎是免费的。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11664627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档