调用内核次数过多时程序停止工作
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 线程。因此,您一次最多应该有一个未完成的内核调用。
我正在使用自推进粒子进行粒子模拟。我的 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 线程。因此,您一次最多应该有一个未完成的内核调用。