确定可以连续分配的GPU设备内存的最大量

5
我目前正在开发一个CUDA应用程序,如果处理的数据足够大,则会使用尽可能多的全局设备内存(VRAM)。我使用cudaMalloc3d分配了一个3D体积,因此我使用的内存必须是连续的。为此,我尝试使用函数cudaMemGetInfo检索空闲设备内存的数量,然后分配尽可能多的可用内存。但是,这似乎行不通。尝试分配该内存量时仍会出现错误。
现在,我的问题是是否有一种方法可以检索我可以连续分配的最大设备内存量。
一种选择是采用试错方法,迭代减少尝试分配的数量,直到成功为止。然而,我不太喜欢这个想法。
背景:我有一个在GPU上执行锥形束CT重建的程序。这些体积可以变得相当大,因此需要在必要时将它们拆分成块。因此,我必须知道最大块的大小,以使它们仍适合全局设备内存。
1个回答

7
现在,我的问题是是否有一种方法可以检索我可以连续分配的最大设备内存量。
没有。经过一些试验和错误,您可以得出一个估计的最大值,例如可用内存的80%,然后使用它。
cudaMalloc的情况通常类似于主机端分配器,例如malloc。如果查询主机操作系统可用的内存,然后尝试在单个malloc调用中分配所有内存,则很可能会失败。

3
迭代的方式确实是这样做的最佳方式。从cudaMemGetInfo返回的可用内存大小开始,每次减少1MiB直到分配调用成功为止。这就是我一直采用的方式。 - talonmies
1
我寻找了一个重复的问题,但很难找到一个足够简单以避免争论的问题。尽管在CUDA标签下有许多类似的问题,@talomies在这里给出的答案概述了迭代方法。 - Robert Crovella
@talonmies:我刚试过迭代的方法,但即使分配内存成功了,我的内核启动仍然失败了。就好像我不得不从错误中恢复一样。你知道我该怎么做吗? - bweber
2
@user1488118:这完全取决于错误是什么。我不会在评论中调试我没有看到的代码。如果您有一个可重现的案例,请发布一个新问题。 - talonmies
@talonmies 抱歉,我的代码出了错。现在已经解决了。但是在尝试失败后,我必须调用 cudaGetLastError(),否则后续的 cuda api 调用将会失败,并且再次给出内存不足的错误。我猜这与“非粘性”错误有关。请参考这个答案。@Robert Crovella: 有类似的问题,但它们无法提供一个好的解决方案,并且它们很老(2011年左右),因此期间可能发生了一些变化。 - bweber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接