【发布时间】: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”是对单个最大大小分配的重用。 “是的”,这是个好主意。您可能只是想尝试一下,因为可以从代码试验中学到很多东西。
-
知道了。对不起,我误读了你的评论。感谢您的建议。我会试试看。