我正在处理一个问题,它突显出我对于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)之类的东西,但我从来没有完全覆盖矩阵元素。应该怎么做才是正确的?
block(X,Y)
元素应该是魔数32的圆整倍数。但是这些7
和8
是什么意思?这个函数可能是一个grid=((N+(X-1)/X, (M+(Y-1)/Y)
,如果是这样,为什么会这样/它的含义是什么? - user30859318 x 8
的具体计算。 - sgarizvi