我有一些cuda代码正在运行一些FFT和其他数学运算,它们根据用户的要求在2 ^ n的块上运行。第一次运行时代码运行良好,但运行足够长时间后它开始失败。最终它将达到这样的程度:如果我运行任何大于2 ^ ll的块大小,我将得不到任何数据(全为零)。我已经通过修改内核代码和我可以告诉内核没有执行的内容完成了一些测试。我试图找出为什么我的代码在大块大小的多次迭代后停止生成数据。
该问题乍一看是内存泄漏。我知道我必须运行多次迭代处理才能导致错误。起初只有大块大小才会停止工作,但是当我运行更多迭代时,更小的块大小也将开始失败。我不确定问题是内存的原因是我的代码适用于低于2 ^ 11的块大小,无论我运行多少次迭代。如果这是一个简单的内存泄漏我会预期症状会逐渐恶化,直到我无法访问卡上的任何内存。
我还注意到较大的块大小(大致相当于每个线程使用的内存量)往往会导致程序更快失败。增加处理的块数(即Cuda线程的数量)似乎不会影响代码何时开始失败。
据我所知,没有返回错误代码,内核似乎根本没有执行。
任何人都可以建议我造成这个问题吗?我想了解如何调试在GPU上运行的代码或监控GPU内存可用性的任何见解。
答案 0 :(得分:0)
如果您需要完成更多计算,请提高网格大小而不是线程块大小。引用CUDA编程指南3.0 on pg。 8,“在当前的GPU上,线程块最多可包含512个 线程“。
这意味着threadIdx.x * threadIdx.y * threadIdx.z< = 512始终。如果你保持这种不变性,那么事情是否有效?