c - 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
知道发生了什么/我该如何解决?谢谢!
解决方案
推荐阅读
- python - 如何在 Python 中有效地定义许多具有关闭名称和关闭内容的函数
- django - Django:模板上重新组合的项目的总和
- flutter - 颤振通知图标在Android中没有改变
- electron - 通过requirejs导入电子
- google-apps-script - 有没有办法在 Google 表格中创建脚本来打印 2 份活动工作表?
- python - Python 如何从打印结果中删除前导回车?
- javascript - JavaScript 前导零数字填充
- reactjs - 在两个组件之间使用 Cookie
- android - 科尔多瓦上的导航栏颜色没有改变
- firebase - 未捕获的错误:预期类型为“FutureOr”的值
',但得到了“MemoryInfo”类型之一