【问题标题】:CUDA-transfer 2D array from host to deviceCUDA-将二维数组从主机传输到设备
【发布时间】: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>>>(?);

}

【问题讨论】:

    标签: gpu cuda


    【解决方案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 通话中从主机复制到设备吗?
    猜你喜欢
    • 2012-07-14
    • 1970-01-01
    • 2017-08-27
    • 1970-01-01
    • 2018-03-13
    • 2013-08-30
    • 2014-09-03
    • 1970-01-01
    • 2018-03-15
    相关资源
    最近更新 更多