所以,我正在尝试分配一个指针列表,每个指针都指向我设备上的一个结构,但是我一直在遇到段错误。这对于正常的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));
}
我希望列表中的每个指针指向我的结构。 为什么这不起作用?
答案 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) );