【问题标题】:CUDA copy jagged array from host to deviceCUDA 将锯齿状阵列从主机复制到设备
【发布时间】:2013-04-10 05:27:42
【问题描述】:

所以我正在尝试将锯齿状数组从主机复制到设备。首先是我目前对cudaMalloc和cudaMemcpy的理解:

cudaMalloc 获取指向内存块的指针。

cudaMemcpy 采用指向要复制到或从中复制的内存块的指针。

如果我错了,请纠正我。

现在这是我的代码不起作用(编译正常但没有输出):

__global__ void kernel(int** arr)
{
    for (int i=0; i<3; i++)
    printf("%d\n", arr[i][0]);
}

int main()
{
    int arr[][3] = {{1},{2},{3}}; // 3 arrays, 1 element each

    int **d_arr;

    cudaMalloc((void**)(&d_arr), sizeof(int*)*3); // allocate for 3 int pointers

    for (int i=0; i<3; i++)
    {
    cudaMalloc( (void**)  &(d_arr[i]), sizeof(int) * 1 ); // allocate for 1 int in each int pointer

    cudaMemcpy(d_arr[i], arr[i], sizeof(int) * 1, cudaMemcpyHostToDevice); // copy data
    }

    kernel<<<1,1>>>(d_arr);

    cudaDeviceSynchronize();
    cudaDeviceReset();
}

那么我在这里做错了什么? 干杯

【问题讨论】:

    标签: cuda


    【解决方案1】:

    我找到了原因,这是因为 cudaMalloc 和 cudaMemcpy 期望指针存在于主机上而不是设备上。

    在我的 for 循环中,我试图在主机上运行的代码中填充设备上存在的指针!

    正确的方法是做一个中间变量,一个指向设备内存的主机上的指针,用整数填充它,然后将该指针复制到锯齿状数组中(指针上的指针)!

    这是正确的版本:

    __global__ void kernel(int** arr)
    {
        for (int i=0; i<3; i++)
            printf("%d\n", arr[i][0]);
    }
    
    int main()
    {
        int arr[][3] = {{1},{2},{3}}; // 3 arrays, 1 element each
    
        int **d_arr;
    
        cudaMalloc((void***)(&d_arr), sizeof(int*)*3); // allocate for 3 int pointers
    
        for (int i=0; i<3; i++)
        {
    
            int* temp;
    
            cudaMalloc( (void**)  &(temp), sizeof(int) * 1 ); // allocate for 1 int in each int pointer
    
            cudaMemcpy(temp, arr[i], sizeof(int) * 1, cudaMemcpyHostToDevice); // copy data
    
            cudaMemcpy(d_arr+i, &temp, sizeof(int*), cudaMemcpyHostToDevice);
        }
    
        kernel<<<1,1>>>(d_arr);
    
        cudaDeviceSynchronize();
        cudaDeviceReset();
    }
    

    【讨论】:

      【解决方案2】:
      1. 你的内核调用printf(),它曾经是(直到CC2.0)一个主机函数。这里一切正常。 ;)

      2. cudaMemcpy((void*)d_arr, (void*)arr, sizeof(int*)*3, cudaMemcpyHostToDevice); 将主机上阵列的内存地址复制到设备。这是没有意义的。因为您现在有了指向设备上主机内存的指针。

      3. 您不能在 CUDA 中以特定方式分配二维数组。见http://www.stevenmarkford.com/allocating-2d-arrays-in-cuda/

      【讨论】:

      • 1- 不,您实际上可以在设备上使用printf()。 2-你是对的。 3-检查我的答案。 4- 谢谢,我会读一读。
      • 1.你是对的,这实际上是可能的,因为计算能力 2 - 。 2. - 3. “这样”不是指你的回答,而是指你的问题。 ;) 4. 不客气。
      猜你喜欢
      • 1970-01-01
      • 2013-03-25
      • 2012-04-04
      • 2016-07-09
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 2021-12-01
      • 1970-01-01
      相关资源
      最近更新 更多