在CUDA中分配指针列表

在CUDA中分配指针列表,c,memory-management,cuda,double-pointer,C,Memory Management,Cuda,Double Pointer,所以,我试图分配一个指针列表,每个指针指向我设备上的一个结构,但我一直得到一个segfault。这在正常的malloc上运行良好,但在cudaMalloc上,事情变得可疑 struct body //struct holding information for one body { int id; float m; //mass float a[3]; //acceleratio

所以,我试图分配一个指针列表,每个指针指向我设备上的一个结构,但我一直得到一个segfault。这在正常的
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));
    }
struct body//struct保存一个body的信息
{
int-id;
float m;//质量
浮点a[3];//加速度
float v[3];//速度
浮动位置[3];//x,y,z
} ;
身体**身体;
Cudamaloc((空白**)和devBodies,n*sizeof(正文*);
对于(i=0;i
我希望列表中的每个指针都指向我的结构。
为什么不工作?

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

解决方案是在主机内存中组装
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*));
struct body//struct保存一个body的信息
{
int-id;
float m;//质量
浮点a[3];//加速度
float v[3];//速度
浮动位置[3];//x,y,z
} ;
身体**身体;
正文**_devBodies=新正文*[n];//devBodies的卷影副本
Cudamaloc((空白**)和devBodies,n*sizeof(正文*);
对于(i=0;i
请注意,然后需要使用
\u devBodies
的内容传递到主机端API


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

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

解决方案是在主机内存中组装
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*));
struct body//struct保存一个body的信息
{
int-id;
float m;//质量
浮点a[3];//加速度
float v[3];//速度
浮动位置[3];//x,y,z
} ;
身体**身体;
正文**_devBodies=新正文*[n];//devBodies的卷影副本
Cudamaloc((空白**)和devBodies,n*sizeof(正文*);
对于(i=0;i
请注意,然后需要使用
\u devBodies
的内容传递到主机端API


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

看看您试图实现的目标,似乎您正在创建许多结构(更具体地说,
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) );

看看您试图实现的目标,似乎您正在创建许多结构(更具体地说,
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) );