【发布时间】:2017-04-24 08:02:18
【问题描述】:
所以我想在CUDA中分配2D数组并在CPU和GPU之间复制它们,但是我是一个完全初学者,其他在线资料对我来说很难理解或不完整。重要的是我能够在内核代码中以二维数组的形式访问它们,如下所示。
请注意,数组的高度 != 宽度,如果可能的话,这会让我更加困惑,因为我总是难以选择网格大小。
我考虑过将它们展平,但我真的想让它以这种方式工作。
这是我自己研究的结果。
__global__ void myKernel(int *firstArray, int *secondArray, int rows, int columns) {
int row = blockIdx.x * blockDim.x + threadIdx.x;
int column = blockIdx.y * blockDim.y + threadIdx.y;
if (row >= rows || column >= columns)
return;
// Do something with the arrays like you would on a CPU, like:
firstArray[row][column] = row * 2;
secondArray[row[column] = row * 3;
}
int main() {
int rows = 300, columns = 200;
int h_firstArray[rows][columns], h_secondArray[rows][columns];
int *d_firstArray[rows][columns], *d_secondArray[rows][columns];
// populate h_ arrays (Can do this bit myself)
// Allocate memory on device, no idea how to do for 2D arrays.
// Do memcopies to GPU, no idea how to do for 2D arrays.
dim3 block(rows,columns);
dim3 grid (1,1);
myKernel<<<grid,block>>>(d_firstArray, d_secondArray, rows, columns);
// Do memcopies back to host, no idea how to do for 2D arrays.
cudaFree(d_firstArray);
cudaFree(d_secondArray);
return 0;
}
编辑:有人问我在我试图解决的问题中是否会在编译时知道数组宽度。您可以假设我目前主要对这种特殊情况感兴趣。
【问题讨论】:
-
cuda tag info page 有一个链接(“使用指针数组...”)解释如何在 CUDA 中处理二维数组。还有许多类似的问题,您可以通过一些谷歌搜索或研究来查看。在您给出的示例中,您的数组 width 在编译时是已知的。对于您想要解决的实际问题,这是真的吗?如果是这样,它可以用来大大简化流程。
-
感谢标签页,我还没有找到。是的,我确实看过其他类似的问题,我的一些解决方案实际上是受到我能理解的问题的启发。没有他们,我不会走到这一步。至于已知的数组宽度 - 在这种特殊情况下是的,您可能会在回答问题时假设它是已知的。我主要对这种确切的情况感兴趣,它是如何工作的。谢谢。
标签: memory-management multidimensional-array cuda