0

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

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

4

2 回答 2

3

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

解决方案是组装主机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 计算。主机上的设置代码不必要地复杂,并且设备上的性能不如平面内存,因为访问数据需要所有额外的指针间接。

于 2014-04-18T11:25:43.803 回答
1

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

您是否有理由不能执行以下操作?

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) );
于 2014-04-18T12:46:15.120 回答