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