【问题标题】:Cuda/PyCuda - Large matrix traversal and block/grid sizeCuda/PyCuda - 大矩阵遍历和块/网格大小
【发布时间】:2013-05-14 05:44:37
【问题描述】:

我正在做的事情突出了一个事实,即我对块和网格在 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) 之类的东西,但我从未完全覆盖矩阵元素。这样做的正确方法是什么?

【问题讨论】:

    标签: matrix cuda gpu pycuda


    【解决方案1】:

    固定块大小,并保持网格大小动态。这样,无论 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... 没错,这是任何块大小的通用公式。我提供了特定于块大小的计算8 x 8
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    • 2019-06-02
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    相关资源
    最近更新 更多