Cuda/PyCuda - 大型矩阵遍历和块/网格大小

3

我正在处理一个问题,它突显出我对于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)之类的东西,但我从来没有完全覆盖矩阵元素。应该怎么做才是正确的?

1个回答

3

固定块大小,保持网格大小动态。这样,无论 M 和 N 的值如何,内核都将覆盖矩阵的每个元素。

block = (8,8)
grid = ((N + 7) / 8, (M + 7) / 8)

使用此网格和块配置启动内核。如果需要,可以更改块大小,但要保持设备的限制。


我知道block(X,Y)元素应该是魔数32的圆整倍数。但是这些78是什么意思?这个函数可能是一个grid=((N+(X-1)/X, (M+(Y-1)/Y),如果是这样,为什么会这样/它的含义是什么? - user3085931
1
@user3085931... 是的,这是适用于任何块大小的通用公式。我提供了针对块大小为 8 x 8 的具体计算。 - sgarizvi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接