在CUDA中分配指针列表

时间:2014-04-18 11:10:51

标签: c memory-management cuda double-pointer

所以,我正在尝试分配一个指针列表,每个指针都指向我设备上的一个结构,但是我一直在遇到段错误。这对于正常的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));
    }

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

2 个答案:

答案 0 :(得分:3)

这不起作用,因为devBodies[i]存储在设备内存中,并且主机无法直接写入。因此内部cudaMalloc调用失败。

解决方案是在{em> host 内存中汇编devBodies的内容,然后将其复制到设备中。您的代码段变为:

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计算。主机上的设置代码不必要地复杂,并且由于访问数据所需的所有附加指针间接,设备上的性能不如平坦内存。

答案 1 :(得分:1)

看看你想要实现的目标,看起来你正在创建一些结构(更具体地说,n结构)。

您有什么理由不能做以下事情吗?

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) );