【发布时间】:2014-10-11 12:03:59
【问题描述】:
我使用的是 CUDA 6.5 + VS2013 + GTX Titan black。我观察到当线程总数大于 65536 时,以下打印代码会崩溃。我搜索了一下,但没有看到任何有用的东西。有没有其他人观察到相同的行为?或者任何人都可以提供一些解释吗?非常感谢!
__global__ void testKernel(int val)
{
int X = blockDim.x * blockIdx.x + threadIdx.x;
int Y = blockDim.y * blockIdx.y + threadIdx.y;
printf("[%d, %d]:\t" "\tValue is:%d\n", X, Y, val);
}
void main(){
dim3 block(16,16);
dim3 grid(16,16);
testKernel << <grid, block >> >(10);
cudaDeviceSynchronize();
cudaGetLastError();
cudaDeviceReset();
}
我在使用 block(32,16) 和 grid(16,16) 时收到以下错误消息:
Gpu API 调用(启动超时并被终止)...
【问题讨论】:
-
我无法重现失败。但是,您可能想知道内核中的
printf功能有很大的限制that you may want to read about。由于各种原因,它确实不是为大规模输出而设计的。特别是这个活动的缓冲区是有限的,当溢出时,之前的缓冲区数据将丢失(即不打印出来)。此外,您可能不会说“将崩溃”,而是具体说明崩溃,例如将崩溃文本粘贴到您的问题中。 -
当我运行您的代码时,即使您希望输出 65536 行,由于缓冲区限制,我只得到 4096 行输出。您遇到的崩溃可能是 Windows TDR 超时,因为每个线程的
printf导致内核花费了很长时间。 -
谢谢罗伯特!您尝试过的线程数是多少?你可以试试块(32,32)网格(32,32)吗?
-
是的,内核需要很长时间并且肯定会达到默认的 Windows TDR 超时。我不确定你在谷歌上搜索了什么,但如果你在谷歌上搜索“启动超时并被终止”,你会得到很多有启发性的结果,比如this one