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

时间:2013-05-19 15:44:33

标签: matrix cuda gpu pycuda

我正在研究一些突出事实,我没有牢牢掌握块和网格如何在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 个答案:

答案 0 :(得分:2)

修复块大小,并保持网格大小动态。这样,无论M和N的值是什么,内核都将覆盖矩阵的每个元素。

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

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