【发布时间】:2018-11-15 17:17:43
【问题描述】:
我正在尝试为 gPb 算法实现构建与图像中每个像素对应的 unsigned char 直方图数组。我无法解决的 cudaMalloc 调用崩溃。我已经查看了其他类似的问题,并且我总是测试之前的操作是否返回 cudaSuccess。这是我的代码:
首先我在我的类 CudaImage 的构造函数中分配这个结构:
bool CudaImage::create2DHistoArray()
{
//preparing histograms
m_LastCudaError = cudaMalloc((void**)&m_dHistograms, (m_Height + 2 * m_Scale) * sizeof(unsigned int*));
if (m_LastCudaError != cudaSuccess)
return false;
//set all histograms to nullptr
m_LastCudaError = cudaMemset(m_dHistograms, 0, (m_Height + 2 * m_Scale) * sizeof(unsigned int*));
if (m_LastCudaError != cudaSuccess)
return false;
return true;
}
然后在某个时候我会调用一个成员函数来分配一些 m_dHistograms[i],如下所示:
bool CudaImage::initializeHistoRange(int start, int stop)
{
for (int i = start; i < stop; ++i) {
m_LastCudaError = cudaMalloc((void**)&m_dHistograms[i], 256 * 2 * m_ArcNo * (m_Width + 2 * m_Scale) * sizeof(unsigned int));
if (m_LastCudaError != cudaSuccess) {
return false;
}
//set all pixels in the gradient images to 0
m_LastCudaError = cudaMemset(m_dHistograms[i], 0, 256 * 2 * m_ArcNo * (m_Width + 2 * m_Scale) * sizeof(unsigned int));
if (m_LastCudaError != cudaSuccess)
return false;
}
return true;
}
最后一个函数中的第一个 cudaMalloc 在没有任何警告的情况下崩溃。使用 cuda-memcheck 运行时,我收到以下消息:
“应用程序在从主机取消引用统一内存时可能遇到错误。请在主机调试器下重新运行应用程序以捕获此类错误。”
谁能帮忙?另一个问题是数组分配是否正确实现。我不想从一开始就分配所有内存,因为它会太多,所以我在构造函数(第一个函数)中只分配指向数组行的指针,然后在应用程序中我在需要时分配内存并释放什么我不需要。
【问题讨论】:
-
在主机代码中读取或修改
m_dHistograms[i]的值是非法的,因为它没有分配在主机内存中。这个问题每周至少在Stack Overflow 上出现一次,并且必须至少有 50 个答案讨论必须如何完成 -
@talonmies 我已经花了一些时间寻找堆栈溢出的答案。我无法从一开始就分配所有内存,因为它会太多。