对于CUDA,我理解“一个块永远不会被多个MP分割。” (http://llpanorama.wordpress.com/2008/06/11/threads-and-blocks-and-grids-oh-my/)。
为了测试这个,我为内核分配了一个非常大的块大小:
__global__ void dummy()
{
}
int main()
{
int N=21504*40000; //21504 is the total threads I found for my Tesla M2070
dim3 grids(1,2);
dim3 thres(N,N);
dummy<<<grids,thres>>>();
return 0;
}
但是,没有编译或运行时错误,也不确定发生了什么......
答案 0 :(得分:2)
如果在虚拟&lt;&lt;&lt;&gt;&gt;&gt;之后添加cudaGetLastError()调用,你将得到一个CUDA启动失败错误(你可以使用cudaGetErrorString(err_code)将错误代码转换为字符串。)
答案 1 :(得分:0)
这些错误不是编译错误,您将在运行后遇到运行时错误。要理解这个句子,你应该了解这个架构。它被设计用于固定线程的通信,这些线程放置在一个MP(SM)的相同线程块通用共享存储器中。因此,他们都居住在同一个SM中,并且不会被派遣。