2013-11-27 47 views
0

我是CPGPU中的新成员,并且我有一个小问题。我的程序需要大量的计算,所以当timout达到时,Windows TDR开始执行,它会停止执行。 可悲的是我没有我的程序运行的计算机上的管理员权限,所以修改注册表项是不可能的。我设法将问题分解成更小的行被处理的图像,我试图调用在for循环内重复执行内核。为了确保卡确实有一些时间来回答我已经把电话之间的一些睡眠时的OS,就像这样:当TDR开始运行时,长时间运行的cuda内核会停止

for(int row = 0; row<image.y; row++){ 
    printf("%d/%d\n", row, image.y); 
    cudaMemset(dev_matrixes, 0, image.x*image.y*sizeof(short)); 
    countEnergyOfRow<<<B,BLOCK_DIM>>>(...); 
    Sleep(750); 
} 

起初它似乎正常工作,但在21迭代司机粉碎了,TDR再次中风。恢复后,CPU不断调用内核,接下来的490次它工作正常。我已经跑了好几次了,每次第21次迭代都是致命的。我也尝试从一个不同的(第18个)索引开始,但是第21次迭代(第39个索引)又出现了这个问题。 我在做什么错,是否有我想念的东西?我应该以某种方式使GPU停止手动计数,或者只是增加睡眠时间?

回答

0

除了Windows TDR之外,Windows WDDM系统还会受到操作的批处理。因此,有一种可能性是,即使单个内核调用未超过超时,操作也会以超出超时的方式进行批处理。

你可以尝试的一件事是简单地进一步缩短内核的执行时间。如果内核的执行时间减少到1/10秒,那么即使批处理操作也不应超过超时。

您可以尝试的另一件事是尝试通过在每次内核调用后发出cudaStreamQuery(0);调用来解决批处理问题。

您可能还会检查第21次迭代是否由于某些原因花费更长时间;您可以添加cudaEvent时间来测量每个内核调用的时间;我相信这将是有益的。

最好的解决方案是在不受WDDM/TDR支配的系统/ GPU上工作。

+0

非常非常感谢!这确实是操作的批处理,导致操作时间过长。不幸的是,我无法缩小内核,但在调用之前添加cudaStreamQuery(0)来解决问题。 更准确地说,我也将它添加到cudaMemset之前,因为它也很长,并且它在某个时候仍然停止。现在它完美地工作。 – user3017074

相关问题