【问题标题】:Can I allocate more memory than necessary with cudaMalloc to avoid reallocating?我可以使用 cudaMalloc 分配比必要更多的内存以避免重新分配吗?
【发布时间】:2018-12-23 14:21:58
【问题描述】:

我正在编写一个代码,它使用 cuSparse 在 GPU 上对数千个稀疏矩阵进行计算。由于 GPU 上的内存是有限的,我需要一一处理,因为其余的内存被其他 GPU 变量和密集矩阵占用了。

我的工作流程(伪代码)如下:

for (i=0;i<1000;i++){
//allocate sparse matrix using cudaMalloc
//copy sparse matrix from host using cudaMemcpy
//do calculation by calling cuSparse
//deallocate sparse matrix with cudaFree
}

在上面,我在每一步中为每个稀疏矩阵分配和释放内存,因为它们的稀疏性不同,因此每个矩阵所需的内存也不同。

我可以做类似的事情吗:

//allocate buffer once in the beginning using cudaMalloc with some extra space such 
//that even the sparse matrix with the highest density would fit.
for (i=0;i<1000;i++){
//copy sparse matrix from host using cudaMemcpy to the same buffer
//do calculation by calling cuSparse
}
//free the buffer once at the end using cudaFree

以上避免了在每次迭代中必须 malloc 和释放缓冲区。上面的方法有用吗?它会提高性能吗?这是一种好的做法还是有更好的方法来做到这一点?

【问题讨论】:

  • 重新使用分配是一种很好的做法,因为它减少了开销,有时会相当大。如果预先知道分配的大小,则为最大的分配足够的空间是一种好的做法。
  • 谢谢。通过使用重新分配,您是指像我所做的那样 cudaMalloc->cudaFree,还是您的意思是使用 C 的 realloc 之类的东西?不幸的是,cuda 没有 realloc 的等价物。如果您将您的回复作为评论作为答案发布,我将接受它。再次感谢。
  • @avgn:没有人提到重新分配。重用分配和重新分配不是一回事。
  • 您问“我可以这样做吗?”。 “this”是对单个最大大小分配的重用。 “是的”,这是个好主意。您可能只是想尝试一下,因为可以从代码试验中学到很多东西。
  • 知道了。对不起,我误读了你的评论。感谢您的建议。我会试试看。

标签: c cuda malloc gpu cublas


【解决方案1】:

以上避免了必须 malloc 和释放每个缓冲区 迭代。以上方法可行吗?

原则上,是的。

它会提高性能吗?

大概吧。内存分配和释放并非没有延迟。

这是一种好的做法还是有更好的方法来做到这一点?

一般来说,是的。许多广泛使用的 GPU 加速框架(例如 Tensorflow)使用这种策略来降低 GPU 上的内存管理成本。您的用例是否有好处需要您自己进行测试。

【讨论】:

    【解决方案2】:

    tl;dr:是的,预先分配

    我会比@talonmies 稍微直率一点:

    cudaMalloc()cudaFree() 非常慢。当您没有其他潜在的 GPU 内存竞争者时,它们也不是必需的 - 只需通过分配您期望可能使用的数量来“全部使用”。然后使用子分配器,或使用给定的slab初始化的分配器,在其中进行子分配。如果您使用的框架提供此功能,请使用它;否则,请自己编写或寻找库为您编写。

    【讨论】:

      猜你喜欢
      • 2021-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-30
      • 2011-03-31
      相关资源
      最近更新 更多