调用内核次数过多时程序停止工作

Program stops working when calling kernel too many times

我正在使用自推进粒子进行粒子模拟。我的 CUDA 内核在每个时间步更新每个粒子的位置。所以我 运行 来自 for 循环的 CUDA 内核。示意图如下所示:

for(int i=0;i<NumberOfTimeSteps;i++)
    Calculate<<<1,N,sharedsize>>>(float *data, other parameters)
    Cudamemcpy(data_cpu,data,...);
    WriteToFile(data_cpu);
end

因此,每个时间步的新数据都是根据先前计算的数据计算的。它工作正常,当 NumberOfTimeSteps 很小的时候。但是在我设置 NumberOfTimeSteps > 500(近似临界值)后,程序停止工作。

我知道,内核执行有一个限制:如果内核执行时间太长,驱动程序可以停止 GPU 计算。但是,在我的代码中,单个内核执行的时间不会随着 NumberOfTimeSteps.

而改变

内核调用次数有限制吗?

谢谢

编辑:还有另一个问题:我没有关闭 mat 文件(我放置结果的地方),并且每一步都不断打开新文件。这最终导致了错误。我投票结束了问题,因为它与 CUDA 无关。罗伯特已经回答了有关 CUDA 内核的问题。

Is there any limitations on the number of kernel calls?

内核调用的次数没有真正的限制。可以异步接受的数量是有限制的,但在这个限制之后,额外的内核调用将简单地阻止 CPU 线程继续进行,直到一些队列槽打开(即直到一些先前发布的内核完成)。

如果您的程序在约 500 次内核调用后失败,那是由于其他一些问题,根据您在问题中显示的内容无法诊断。

如果 "program stops working" 你的意思是你遇到了 WDDM 超时,那么基于 WDDM 中的批处理内核调用是可能的,即使单个内核调用不超过超时时间,返回 - to-back 内核调用可能会超过看门狗超时。这真的不应该发生在你的情况下,因为 cudaMemcpy 正如你所展示的那样它不是一个异步操作;它阻塞了 CPU 线程。因此,您一次最多应该有一个未完成的内核调用。