【问题标题】:Allocate 2D Array on Device Memory in CUDA在 CUDA 中的设备内存上分配二维数组
【发布时间】:2010-11-06 01:13:10
【问题描述】:

如何在 Cuda 的设备内存中分配和传输(与主机之间)二维数组?

【问题讨论】:

    标签: multidimensional-array memory-management 2d cuda device


    【解决方案1】:

    我找到了解决这个问题的方法。我不必展平阵列。

    内置的cudaMallocPitch() 函数完成了这项工作。我可以使用cudaMemcpy2D() 函数将数组传入和传出设备。

    例如

    cudaMallocPitch((void**) &array, &pitch, a*sizeof(float), b);
    

    这将创建一个大小为 a*b 的二维数组,其中音高作为参数传入。

    以下代码创建一个二维数组并循环遍历元素。它很容易编译,你可以使用它。

    #include<stdio.h>
    #include<cuda.h>
    #define height 50
    #define width 50
    
    // Device code
    __global__ void kernel(float* devPtr, int pitch)
    {
        for (int r = 0; r < height; ++r) {
            float* row = (float*)((char*)devPtr + r * pitch);
            for (int c = 0; c < width; ++c) {
                 float element = row[c];
            }
        }
    }
    
    //Host Code
    int main()
    {
    
    float* devPtr;
    size_t pitch;
    cudaMallocPitch((void**)&devPtr, &pitch, width * sizeof(float), height);
    kernel<<<100, 512>>>(devPtr, pitch);
    return 0;
    }
    

    【讨论】:

    • 以后可以为数组分配新行吗?
    【解决方案2】:

    扁平化:使其成为一维的。看看它是如何完成的here

    【讨论】:

      【解决方案3】:

      您的设备代码可能会更快。尝试更多地利用线程。

      __global__ void kernel(float* devPtr, int pitch)
      {
          int r = threadIdx.x;
      
          float* row = (float*)((char*)devPtr + r * pitch);
          for (int c = 0; c < width; ++c) {
               float element = row[c];
          }
      }
      

      然后您计算适当的块和线程分配,以便每个线程处理单个元素。

      【讨论】:

      • Gitmo 发布的代码是文档中的无用示例。是的,您的版本更快,但是如何并行处理行和列?严格来说,您可能手头一团糟,因为您不检查 r 是否小于实际行数
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-22
      • 2012-02-05
      • 1970-01-01
      • 2015-02-01
      • 1970-01-01
      相关资源
      最近更新 更多