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

Memory 确定可连续分配的最大GPU设备内存量,memory,memory-management,cuda,Memory,Memory Management,Cuda,我目前正在开发一个CUDA应用程序,如果处理的数据足够大,它将使用尽可能多的全局设备内存(VRAM)。我分配的是一个使用cudamaloc3d的3D卷,因此我使用的内存必须是连续的。为此,我尝试使用函数cudaMemGetInfo检索可用设备内存量,然后分配尽可能多的可用内存。然而,这似乎不起作用。我在尝试分配那个数量的内存时仍然会出错 现在,我的问题是,是否有一种方法可以检索我可以连续分配的最大设备内存量 一种选择是一种反复试验的方法,在这种方法中,我迭代地减少我尝试分配的金额,直到分配成功。

我目前正在开发一个CUDA应用程序,如果处理的数据足够大,它将使用尽可能多的全局设备内存(VRAM)。我分配的是一个使用
cudamaloc3d
的3D卷,因此我使用的内存必须是连续的。为此,我尝试使用函数
cudaMemGetInfo
检索可用设备内存量,然后分配尽可能多的可用内存。然而,这似乎不起作用。我在尝试分配那个数量的内存时仍然会出错

现在,我的问题是,是否有一种方法可以检索我可以连续分配的最大设备内存量

一种选择是一种反复试验的方法,在这种方法中,我迭代地减少我尝试分配的金额,直到分配成功。然而,我不太喜欢这个想法

背景:我有一个在GPU上进行锥束CT重建的程序。这些卷可能会变得相当大,所以我会在必要时将它们分割成块。因此,我必须知道一个块最多可以有多大才能仍然适合全局设备内存

现在,我的问题是,是否有一种方法可以检索我可以连续分配的最大设备内存量

没有

通过一些尝试和错误,您可以得出一个估计的最大值,比如说
cudaMemGetInfo()
报告的可用内存的80%,并使用它


使用
cudamaloc
的情况通常类似于主机端分配器,例如
malloc
。如果您向主机操作系统查询可用内存,然后尝试在一个
malloc
调用中分配所有内存,则很可能会失败。

迭代方法确实是解决此问题的最佳方法。将cudaMemGetInfo视为免费,并以1MiB的增量向下移动,直到分配调用成功。我一直都是这样做的。我找了一个复制品,但找不到一个简单到可以避免争论的。尽管如此,CUDA标签上仍有许多类似的问题,迭代方法由@talomies给出的答案概括。@talonmies:我刚刚尝试了迭代方法,但即使在malloc成功之后,我的内核启动还是失败了。好像我必须从错误中恢复过来。你知道我必须做什么吗?@user1488118:那完全取决于错误是什么。我不会调试我在注释中没有看到的代码。如果您有重新编译的案例,请发布一个新问题。@Talonmes抱歉,这是我的代码中的一个错误。现在它起作用了。但是在一次失败的尝试之后,我将不得不调用
cudaGetLastError()
,否则后续的cuda api调用将失败,并再次发出内存不足错误。我想这与“非粘性”错误有关。请看@Robert Crovella:也有类似的问题,但它们不能提供一个好的解决方案,而且它们非常古老(2011年或其他),因此在此期间可能发生了一些变化。