我正在做的事情突出了一个事实,即我对 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/