首页 > 解决方案 > cudaMalloc 给出一个 NULL 指针

问题描述

所以我有以下内核(还有更多内容,但错误只与这部分有关,因为其他所有内容都被注释掉了):

const int CHNL_SIZE = 1024;
const int NUM_CHNL = 3;
const int NUM_IMG = 60000;

__global__ void cuda_prepData(GPUImg_T *imgs) {
  for (int i = 0; i < NUM_IMG; i++) {
    cudaMalloc((void **)&imgs[i].pxls, CHNL_SIZE * NUM_CHNL * sizeof(double));
    assert(imgs[i].pxls != NULL);
    imgs[i].pxls[0] = 0.5f;
  }
}

它是这样从主机调用的:

  cudaMalloc((void **)&data->imgs, NUM_IMG * sizeof(GPUImg_T));
  cuda_prepData<<<1, 1>>>(data->imgs);
  cudaDeviceSynchronize();

自然地,data包含 GPUImg_T 的 1d 数组,每个数组都包含 pxls 的 1d 数组。我正在尝试 cudaMalloc 并在我的内核中分配每个 pxls 数组,它现在只是使用一个线程进行调试。出于某种原因,当我尝试取消引用时,程序会崩溃imgs[314].pxls(我已经尝试了多次,它总是 314)。我将 assert 语句放入测试中,结果发现 cudaMalloc 分配imgs[314].pxls给 NULL。我的第一个假设是我的视频内存用完了,所以我使用nvidia-smi(我在 linux 上)检查我的 GPU 使用情况,它表明该程序只使用了 ~135/8111MiB。当我删除断言时,cuda-memcheck报告以下内容:

========= Invalid __global__ write of size 8
=========     at 0x000002f0 in cuda_prepData(unsigned char*, unsigned char*, unsigned char*, GPUImg*)
=========     by thread (0,0,0) in block (0,0,0)
=========     Address 0x00000000 is out of bounds

知道发生了什么/我该如何解决?谢谢!

标签: cnullcuda

解决方案


推荐阅读