我可以使用cudaMalloc分配比必要更多的内存,以避免重新分配吗?

时间:2018-07-16 05:20:38

标签: c cuda malloc gpu cublas

我正在编写一个代码,使用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和释放缓冲区。以上工作吗?会提高性能吗?是好的做法还是有更好的方法呢?

2 个答案:

答案 0 :(得分:3)

  

以上内容避免了必须分配和释放每个缓冲区中的缓冲区   迭代。以上工作有效吗?

原则上是。

  

会提高性能吗?

可能是。内存分配和释放并非没有延迟。

  

这是一种好习惯还是有更好的方法呢?

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

答案 1 :(得分:1)

tl; dr:是,请预先分配

我会比@talonmies更加直率:

cudaMalloc()cudaFree()非常慢。当您没有其他潜在的GPU内存竞争者时,它们也不是必需的-只需分配尽可能多的预期资源即可“全部使用”。然后使用一个子分配器,或用给定的slab初始化的分配器,在其中分配子分配。如果您使用的框架提供了此功能,请使用它。否则,请自己编写或寻找可以为您做的图书馆。