我正在尝试构建一个我想在Cuda内核中使用的树结构。为此,我使用cudaMallocManaged()分配内存,以便Cuda在需要时将结构复制到GPU。但无论结构的大小如何,我都会得到“内存不足”的信息。即使CPU和GPU内存仍有大量内存空间,大约65407内存分配也会出错。
任何人都可以帮助我并指出限制我的计划的特定边界吗?这是Cuda的硬限制还是我错过了操作系统配置中的设置?
我在Ubuntu 14.04桌面上使用带有Cuda 7.5的GeForce GTX 980。
以下是一个示例程序:
#include <stdio.h>
#include <cuda_runtime.h>
typedef struct Tree {
u_int64_t foo;
struct Tree *left_child;
struct Tree *right_child;
} Tree;
void printMemInfo(size_t counter) {
size_t freemem;
size_t totalmem;
cudaMemGetInfo(&freemem, &totalmem);
printf("%4.2fMB/ %4.2fMB (Free/ Total), #Nodes: %lu\n",
freemem / (1024 * 1024.0),
totalmem / (1024 * 1024.0),
counter);
}
void printCudaError(cudaError_t error) {
if (error != cudaSuccess) {
fprintf(stderr, "Error: %s:%d, ", __FILE__, __LINE__);
fprintf(stderr, "code: %d, reason: %s\n", error,
cudaGetErrorString(error));
exit(1);
}
}
int main (int argc, char *argv[]) {
cudaSetDevice(0);
size_t numnodes = 1000000;
Tree *node[numnodes];
for(size_t i = 0; i < numnodes; i++) {
printMemInfo(i);
cudaError_t error = cudaMallocManaged( (void **) &node[i], sizeof(Tree) );
printCudaError(error);
}
cudaDeviceReset();
return 0;
}
返回:
...
3393.63MB/ 4095.31MB (Free/ Total), #Nodes: 65405
3393.63MB/ 4095.31MB (Free/ Total), #Nodes: 65406
3393.63MB/ 4095.31MB (Free/ Total), #Nodes: 65407
Error: memory_problem/test.cu:23, code: 2, reason: out of memory