CUDA-将二维数组从主机传输到设备

Posted

技术标签:

【中文标题】CUDA-将二维数组从主机传输到设备【英文标题】:CUDA-transfer 2D array from host to device 【发布时间】:2012-02-21 07:49:42 【问题描述】:

我主要有一个二维矩阵。我想从主机转移到设备。您能告诉我如何为它分配内存并将其传输到设备内存吗?

#define N 5
__global__ void kernel(int a[N][N])

int main(void)

    int a[N][N];
    cudaMalloc(?);
    cudaMemcpy(?);
    kernel<<<N,N>>>(?);


【问题讨论】:

【参考方案1】:

也许你真正想到的是这样的:

#define N 5 
__global__ void kernel(int *a)

    // Thread indexing within Grid - note these are
    // in column major order.
    int tidx = threadIdx.x + blockIdx.x * blockDim.x;
    int tidy = threadIdx.y + blockIdx.y * blockDim.y;

    // a_ij = a[i][j], where a is in row major order
    int a_ij = a[tidy +  tidx*N];
 

int main(void)

    int a[N][N], *a_device;
    const size_t a_size = sizeof(int) * size_t(N*N);
    cudaMalloc((void **)&a_device, a_size); 
    cudaMemcpy(a_device, a, a_size, cudaMemcpyHostToDevice); 
    kernel<<<N,N>>>(a_device); 
 

你可能错过的一点是,当你静态声明一个像A[N][N] 这样的数组时,它实际上只是一个row major ordered 线性内存。编译器在发出代码时会自动在a[i][j]a[j + i*N] 之间进行转换。在 GPU 上,您必须使用第二种访问形式来读取您从主机复制的内存。

【讨论】:

感谢 Mark 的错字修复。没有仔细看就从原始帖子中复制它们。 您不应该在cudaMemcpy 通话中从主机复制到设备吗?

以上是关于CUDA-将二维数组从主机传输到设备的主要内容,如果未能解决你的问题,请参考以下文章

优化 CUDA 二维数组访问

NVIDIA Cuda if 语句 [关闭]

OpenCV二维Mat数组(二级指针)在CUDA中的使用

如何将二维数组从 C# 传递到 C++?

cuda 编 程简单CUDA程序的基本框架

LC2022. 将一维数组转变成二维数组