“cudaMallocManaged”比“cudaMalloc”慢吗?

Posted

技术标签:

【中文标题】“cudaMallocManaged”比“cudaMalloc”慢吗?【英文标题】:Is "cudaMallocManaged" slower than "cudaMalloc"? 【发布时间】:2014-03-26 01:02:52 【问题描述】:

我下载了 CUDA 6.0 RC 并在我的应用程序中使用“cudaMallocManaged”测试了新的统一内存。但是,我发现这个内核变慢了。

与 cudaMallocManaged (~0.63) 相比,使用 cudaMalloc 后跟 cudaMemcpy 更快 (~0.56)。这是预期的吗?

website 中的一个声称 cudaMallocManged 用于“更快的 cuda 内核原型设计”,所以我想知道在性能方面哪个应用程序更好?

谢谢。

【问题讨论】:

如果主机内存被固定,是的,它应该比托管内存快。 但我没有使用任何固定内存。 如何分配主机内存? 我复制了上面的内核调用部分和分配部分供参考。 谢谢,但是如何分配主机内存(*.data)? 【参考方案1】:

cudaMallocManaged()不是关于加快您的应用程序的(除了一些例外或极端情况,下面建议了一些)。

今天统一内存和cudaMallocManaged 的实现将不会比熟练的 CUDA 程序员编写的智能编写的代码更快来做同样的事情。机器(cuda 运行时)并不比程序员聪明。 cudaMallocManaged 不会神奇地使 PCIE 总线或一般机器架构限制消失。

快速原型是指您编写代码所花费的时间,而不是代码的速度。

cudaMallocManaged 在以下情况下可能会引起精通 cuda 程序员的兴趣:

    您有兴趣快速组装原型 - 即你不在乎最后一盎司的表现。 您正在处理一个不常使用的复杂数据结构(例如双向链表),否则移植到 CUDA 会很麻烦(因为使用普通 CUDA 代码的深拷贝往往很麻烦)。它是您的应用程序运行所必需的,但不是性能路径的一部分。 您通常会使用零拷贝。在某些情况下,使用 cudaMallocManaged 可能比简单或低效的零拷贝方法更快。

cudaMallocManaged 可能会引起非精通 CUDA 程序员的兴趣,因为它允许您沿着可能更简单的学习曲线开始使用 CUDA。 (但是,请注意,幼稚地使用 cudaMallocManaged 可能会导致 CUDA 内核运行速度低于预期,请参阅 here 和 here。)

尽管 cmets 中提到了 Maxwell,但 CUDA UM 将在某些设置中为某些 GPU 提供 Pascal 一代 GPU 的主要新功能。特别是这些设置中的Unified Memory将不再局限于可用的GPU设备内存,即使在内核运行时内存处理粒度也会下降到页面级别。你可以阅读更多关于它的信息here。

【讨论】:

感谢您的详细回复。我想在我的情况下 cudamalloc 更适合。非常感谢.... 如果我没记错的话,Maxwell 架构应该为统一内存提供硬件支持,因此 cudaMallocManaged() 可以在该架构上提供更好的性能。 我的陈述主要是为了反映统一记忆今天会做什么。可以合理地假设 UM 的未来发展将:1. 在 GPU 和主机上利用更新的硬件架构,以及 2. 进一步模糊界限在熟练的 CUDA 程序员可以或应该处理的事情与可以或应该留给机器(CUDA 运行时)完成的事情之间。 同意 100%。因为你的回答没有提到麦克斯韦,所以只是做个笔记。

以上是关于“cudaMallocManaged”比“cudaMalloc”慢吗?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在使用 cudaMallocManaged 时 NVIDIA Pascal GPU 运行 CUDA 内核速度很慢

CUDA中使用多维数组

CUDA统一内存和Windows 10

CUDA统一内存

CUDA统一内存

nvidia cuda访问gpu共享内存