我的程序分析了一个视频文件,该文件表示为一个 3d 数组并从 LabView 发送到我的程序。LabView 已经将这个 3d 数组扁平化为 1d 数组,所以我刚刚在 CUDA 中分配了一个 1d 数组,使用 cudaMalloc,并使用 cudaMemcpy 复制数据。但是我注意到,如果我发送超过 2XXX、120x240 像素图像,我会从我的一些 cuda 内存函数(cudamemcpy 和 cudafree,在调用几个内核后在我的程序中稍后发生)得到一个“未知错误”,并且这些最终破坏了我的程序。但是,如果我在发送图像时降低数字,我没有问题。这让我相信我的代码很好,但我的内存分配做法很糟糕。
首先,让我们谈谈 Pitched 内存。据我所知,这就是选择一个合适的大小来分配内存,这样线性数据就不会分成两个块。这对于 2d 和 3d 数组尤其常见,因为您希望将行或列一起保存在内存中以便快速访问。
如果我不使用音高记忆,会不会出现这些问题?不使用倾斜内存时会出现哪些错误,尤其是对于这些非常大的数组?到目前为止,我忽略了使用 cudaMallocPitch 和 cudaMalloc3d 的选项,尽管我在技术上确实有 2d 和 3d 数组,我已经将它们展平了。
最后,当 cudaGetLastError 只告诉我“未知错误”时,如何进一步调试我的代码问题?我能够找到哪个函数有问题,但是当它像 cudaFree 这样的 somthign 时,我无法调试这种东西,或者找出问题的根源。
无论如何,感谢您的帮助。