【问题标题】:Allocating a list of pointers in CUDA在 CUDA 中分配指针列表
【发布时间】:2014-06-02 21:24:24
【问题描述】:

所以,我正在尝试分配一个指针列表,每个指针都指向我设备上的一个结构,但我不断收到段错误。这适用于普通的malloc,但使用cudaMalloc,事情就会变得可疑。

struct body //struct holding information for one body
    {
        int id;
        float m;                    //mass
        float a[3];             //acceleration
        float v[3];             //velocity
        float pos[3];            //x, y, z
    } ;

body** devBodies;
cudaMalloc( (void**)&devBodies, n * sizeof(body*) );

for(i = 0; i < n; i++)
    {
        cudaMalloc( (void**)&devBodies[i], sizeof(body));
    }

我希望列表中的每个指针都指向我的结构。 为什么这不起作用?

【问题讨论】:

    标签: c memory-management cuda double-pointer


    【解决方案1】:

    这不起作用,因为devBodies[i] 存储在设备内存中,主机不能直接写入。所以内部的cudaMalloc 调用失败了。

    解决方案是将devBodies 的内容组装到主机 内存中,然后将其复制到设备。你的代码 sn-p 变成这样:

    struct body //struct holding information for one body
        {
            int id;
            float m;                //mass
            float a[3];             //acceleration
            float v[3];             //velocity
            float pos[3];           //x, y, z
        } ;
    
    body** devBodies;
    body** _devBodies = new body*[n]; // shadow copy of devBodies
    
    cudaMalloc( (void**)&devBodies, n * sizeof(body*) );
    
    for(i = 0; i < n; i++){
        cudaMalloc( (void**)&_devBodies[i], sizeof(body));
    }
    
    cudaMemcpy(devBodies, _devBodies, n * sizeof(body*));
    

    请注意,您需要使用_devBodies 的内容来传递给主机端API。

    一般来说,这种类型的指针数组非常不适合 GPU 计算。主机上的设置代码过于复杂,而且设备上的性能不如平面内存,因为访问数据需要额外的指针间接。

    【讨论】:

      【解决方案2】:

      看看您想要实现的目标,似乎您正在创建许多结构(更具体地说,n structs)。

      您不能执行以下操作有什么原因吗?

      struct body //struct holding information for one body
          {
              int id;
              float m;                    //mass
              float a[3];             //acceleration
              float v[3];             //velocity
              float pos[3];            //x, y, z
          } ;
      
      body* devBodies;
      cudaMalloc( (void*)&devBodies, n * sizeof(body) );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-06
        • 2020-12-12
        • 1970-01-01
        • 1970-01-01
        • 2013-07-02
        • 1970-01-01
        • 1970-01-01
        • 2015-03-20
        相关资源
        最近更新 更多