我正在使用自行推进的粒子进行粒子模拟。我的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&gt;之后500(近似临界值),程序停止工作。
我知道,内核执行存在限制:如果内核执行时间过长,驱动程序可以停止GPU计算。但是,在我的代码中,单个内核执行的时间不随NumberOfTimeSteps
而变化。
内核调用的数量有限制吗?
由于
编辑:还有另一个问题:我没有关闭mat文件(我放置结果的地方),并且每一步都保持打开新文件。这最终导致错误。我投票赞成问题,因为它与CUDA无关。罗伯特回答了关于CUDA内核的问题。答案 0 :(得分:2)
内核调用的数量有限制吗?
内核调用的数量没有实际限制。可以异步接受的数量是有限的,但是在此限制之后,额外的内核调用将阻止CPU线程继续进行,直到某些队列插槽打开(即直到某些先前发布的内核完成)。
如果您的程序在~500内核调用后失败,则是由于其他一些问题,根据您在问题中显示的内容无法诊断。
如果“程序停止工作”意味着你遇到WDDM超时,则可能基于WDDM中的批量内核调用,即使单个内核调用不超过超时时间,也可以回到 - 后端内核调用可能超过看门狗超时。在你的情况下,这真的不应该发生,因为你已经证明cudaMemcpy
不是异步操作;它会阻塞CPU线程。因此,一次最多只能有一个未完成的内核调用。