我正在研究一些突出事实,我没有牢牢掌握块和网格如何在cuda中工作。我有一个1000x10矩阵,我想遍历并用值填充每个元素。内核是这样的:
__global__ void myfun(float *vals,float *out, int M, int N)
{
int row = blockIdx.y*blockDim.y + threadIdx.y;
int col = blockIdx.x*blockDim.x + threadIdx.x;
int index = row*N + col;
if( (row < M ) && (col < N) ) {
out[index] = index;
}
}
其中,M = 1000,N = 10.我不知道如何对其进行切片,以便我可以覆盖矩阵中的每个元素。由于我需要覆盖1000 * 10 = 10,000个元素并且考虑到线程数量的限制,我不能使用块大小(10,1000,1)。使用pycuda,我尝试过像block =(10,100,1),grid =(1,10)这样的东西,但我从未完全覆盖矩阵元素。什么是正确的方法?
答案 0 :(得分:2)
修复块大小,并保持网格大小动态。这样,无论M和N的值是什么,内核都将覆盖矩阵的每个元素。
block = (8,8)
grid = ((N + 7) / 8, (M + 7) / 8)
使用此网格和块配置启动内核。保持设备的限制,您可以根据需要更改块大小。