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

与cudaMallocManaged(〜0.63)相比,使用cudaMalloccudaMemcpy更快(〜0.56)。

website之一声称cudaMallocManged是为了“更快地创建cuda内核原型(prototype)”,所以我想知道从性能角度来看,哪个应用程序是更好的选择?

谢谢。

最佳答案

cudaMallocManaged()并不是要加快您的应用程序的速度(有一些异常(exception)情况或特殊情况,下面建议一些异常(exception)情况)。
如今,统一内存和cudaMallocManaged的实现不会比熟练的CUDA程序员以智能方式编写的代码更快。机器(CUDA运行时)并不比您作为程序员聪明。 cudaMallocManaged不会神奇地使PCIE总线或通用计算机体系结构限制消失。
快速原型(prototype)指的是您编写代码所花费的时间,而不是代码的速度。
在以下情况下,熟练的cuda程序员可能会对cudaMallocManaged感兴趣:

  • 您有兴趣快速将原型(prototype)放在一起-即您不必在意最后的表现。
  • 您正在处理不经常使用的复杂数据结构(例如,双向链接列表),否则将是移植到CUDA的麻烦(因为使用普通CUDA代码的深拷贝往往很麻烦)。您的应用程序必须正常工作,但不是性能路径的一部分。
  • 通常,您将使用零复制。在某些情况下,使用cudaMallocManaged可能比幼稚或效率低下的零复制方法更快。

  • 不熟练的CUDA程序员可能会对cudaMallocManaged感兴趣,因为它使您可以沿着可能更简单的学习曲线与CUDA接触。 (但是,请注意cudaMallocManaged的天真使用可能会导致CUDA内核的运行速度比预期的慢,请参阅herehere。)
    尽管在评论中提到了Maxwell,但CUDA UM将在某些设置中为某些GPU提供Pascal一代GPU的主要新功能。特别是,这些设置中的统一内存将不再仅限于可用的GPU设备内存,并且即使内核正在运行,内存处理粒度也将降至页面级别。您可以阅读有关它的更多信息here

    关于cuda - "cudaMallocManaged"是否比 "cudaMalloc"慢?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21986542/

    10-13 08:37