我刚刚从4.0更新到最新(发布)CUDA 4.1,我的项目都没有正常工作。而且,问题似乎不稳定。我能理解的是,在NULL
之后,某些设备内存指针仍然是cudaMalloc
,但这不会立即发生。 Nsight和视觉分析器告诉我一些与内存相关的函数(cudaMemcpy
等)正在返回未知的错误标志。 cudaStreamQuery
也主要返回未就绪的流标志。
对于模糊不清而感到抱歉,但这就是它的要点。不同的项目以不同的方式表现出问题,但主要是空指针。
任何人都知道会给出什么?
更新:好吧,在其中一个项目中,Nsight Debugger正在标记超出范围的内存负载,但我仍然无法理解原因。这之前有用。此外,考虑到代码,CUDA调试器所说的我试图访问的地址没有多大意义:
// Get the mask pixel, if it has been supplied.
if (maskImage != NULL)
maskPixel = *(static_cast<uchar*>(maskImage->imageData) + maskImage->widthStep * (int) yPosition + (int) xPosition);
现在,根据调试器,整个warp试图访问超出边界的地址。但是yPosition
和。{
xPosition
值均小于蒙版尺寸!此外,此warp中的所有线程(除少数线程之外)尝试访问的地址为0x200000002
。我无法理解它。
更新2:我已经修复了最后一个问题 - 正如预期的那样,这是用户错误。现在我在另一个项目中有另一个,这次,我可以确认它与CUDA 4.1相关。 cudaBindTexture2D()
提出invalid argument
错误,而不是之前的错误。我想这是一个纹理对齐问题?
答案 0 :(得分:0)
如上所述,CUDA在cudaBindTexture2D()
失败了。我通过确保内存分配完全一致来解决这个问题。特别是,我将所有2D(图像)分配更改为使用间距内存,将cudaMalloc()
替换为cudaMallocPitch()
。这会解决对齐问题。