我刚刚从CUDA 4.0更新到最新版本的CUDA 4.1,但我的所有项目都无法正常工作。此外,问题似乎是不稳定的。我可以理解的是,在cudaMalloc之后,一些指向设备内存的指针仍然保持为NULL,但这并非立即发生。N视图和可视化分析器告诉我,一些与内存相关的函数(如cudaMemcpy)返回未知的错误标志。cudaStreamQuery主要也返回未准备好的流标志。
抱歉表述含糊,但这就是问题的要点。不同的项目以不同的方式表现出问题,但主要是空指针。
有人知道是什么原因吗?
更新:在其中一个项目中,Nsight调试器标记了一个超出范围的内存加载错误,但我仍然无法理解为什么会这样。这以前是有效的。此外,CUDA调试器所说的我正在尝试访问的地址并没有太多意义,考虑到代码。
现在,根据调试器,整个warp都在尝试访问越界地址。但是
更新2:我已经解决了最后一个问题——正如预期的那样,这是用户错误。现在我在另一个项目中遇到了另一个问题,这次我可以确认与CUDA 4.1有关。
抱歉表述含糊,但这就是问题的要点。不同的项目以不同的方式表现出问题,但主要是空指针。
有人知道是什么原因吗?
更新:在其中一个项目中,Nsight调试器标记了一个超出范围的内存加载错误,但我仍然无法理解为什么会这样。这以前是有效的。此外,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
错误,而以前没有。我猜这是一个纹理对齐问题?