cudaMallocManaged()返回"内存不足"尽管有足够的自由空间

时间:2016-06-28 14:17:37

标签: c++ c linux memory cuda

我正在尝试构建一个我想在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

0 个答案:

没有答案