在提问之前,我已经阅读了 这个问题,它与我的问题类似。
这里我将详细介绍我的程序。
#define N 70000
#define M 1000
class ObjBox
{public:
int oid; float x; float y; float ts};
class Bucket
{public:
int bid; int nxt; ObjBox *arr_obj; int nO;}
int main()
{
Bucket *arr_bkt;
cudaMallocManaged(&arr_bkt, N * sizeof(Bucket));
for (int i = 0; i < N; i++)
{
arr_bkt[i].bid = i;
arr_bkt[i].nxt = -1;
arr_bkt[i].nO = 0;
cudaError_t r = cudaMallocManaged(&(arr_bkt[i].arr_obj), M * sizeof(ObjBox));
if (r != cudaSuccess)
{
printf("CUDA Error on %s\n", cudaGetErrorString(r));
exit(0);
}
for (int j = 0; j < M; j++)
{
arr_bkt[i].arr_obj[j].oid = -1;
arr_bkt[i].arr_obj[j].x = -1;
arr_bkt[i].arr_obj[j].y = -1;
arr_bkt[i].arr_obj[j].ts = -1;
}
}
cout << "Bucket Array Initial Completed..." << endl;
cudaFree(arr_bkt);
return 0;
}
在我的主程序中,我分配了一个类型为Bucket的数组,其中包含一个嵌套数组ObjBox。数组中共有N(70000)个Bucket,每个Bucket中有M(1000)个ObjBox。我可以正常编译程序,但在运行时会出现内存不足错误,错误位于代码行
cudaError_t r = cudaMallocManaged(&(arr_bkt[i].arr_obj), M * sizeof(ObjBox));
。我已经尝试解决这个问题很长时间了,以下是我发现的一些要点:
1、当N较小时,如30000、40000、60000等,程序可以正常工作。也就是说,它可以在一个结构中分配这么多统一的内存;
2、仍然有很多空闲内存。在我的服务器上,有16G的主机内存和11G的GPU全局内存。但在这个程序中,Bucket数组几乎占用了所有内存。
N * M * sizeof(ObjBox) = 70000 * 1000 * 16Byte = 1120M;
3、值 M 几乎与内存不足错误无关;当 N 保持不变(70000),M 减少到100时,程序也会崩溃;
我的 GPU 类型是 Tesla K40c,我已向导师提出了我的问题,她将其转交给她的朋友,在她的 CUDA 版本为7.0 的 Tesla K20 上运行该程序,可以正常分配结构。
怎么样?我如何在我的 Tesla K40c 中分配结构?我的导师认为 GPU 驱动程序中可能有一些限制设置,但我还没有解决它;