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

标签 matrix cuda gpu pycuda

我正在做的事情突出了一个事实,即我对 block 和网格在 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) 的 block 大小。使用 pycuda,我尝试过像 block = (10,100,1), grid = (1,10) 这样的东西,但我从来没有完全覆盖矩阵元素。执行此操作的正确方法是什么?

最佳答案

固定 block 大小,并保持网格大小动态。这样无论M和N的值是多少,内核都会覆盖矩阵的每个元素。

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

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

关于matrix - Cuda/PyCuda - 大型矩阵遍历和 block /网格大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16636445/

相关文章:

opencv - 单应矩阵乘法

java - cpu的矩阵访问和乘法优化

c++ - 在 Nvidia NPP ImageCPU 对象中设置像素值?

cuda - win32 的 cufft.lib 丢失

cuda内核的配置参数

matrix - 如何在solidity中定义矩阵?

CUDA:设备序号无效

c++ - 基于 cuda 推力的方法对 TCP 流中的数据包进行分组

tensorflow - 用 GPU 代替 TPU 训练莎士比亚模型

c++ - C++ 中的 vector 、代理类和点运算符