cudaMemCpy2d错误(cudaErrorInvalidValue)运行" debug"组态

时间:2014-12-17 04:43:18

标签: c++ visual-studio-2013 cuda nsight buildconfiguration

这让我发疯了。我无法弄清楚为什么会发生这种情况。基本上,我有这个代码在Linux(Nsight eclipse版)下完全正常工作。我尝试通过创建Visual Studio 2013项目并对其进行配置来使其与Windows兼容。

此时一切似乎都很好,代码编译没有任何问题。当我使用“Release”配置时,它甚至运行良好。但是,只要我尝试调试配置,下面的部分就会发生cudaErrorInvalidValue错误而崩溃 我已经将问题追溯到优化标志。禁用优化将导致崩溃。使用/O2/O1,代码运行正常!

同样,无论是否优化,这在Linux下运行良好。我想知道在Windows优化中给出了什么。如果它有任何帮助,我使用Visual Studio 2013(Update 4)与CUDA 6.5和静态库链接。 (在Linux上它是CUDA 6.5但动态库链接)。

整个代码可用here

size_t hostPitch = (size_t)getHostPitch();
size_t devicePitch = (size_t)getDevicePitch();
size_t cal = (size_t)(width * numChannels * sizeof(T));
size_t h = (size_t)height;
cudaError_t eCUDAResult = cudaMemcpy2D((void*)this->hostData, hostPitch, (const void*)this->deviceData, devicePitch, cal, h, cudaMemcpyDeviceToHost);

1 个答案:

答案 0 :(得分:3)

@Park Young-Bae的评论解决了我的问题(尽管比起一个简单的断点需要更多的努力!)
未定义的行为是由于我的粗心造成的。在其中一个类中,我忘记了覆盖副本和分配。因此,当一个对象被返回时,它的析构函数被调用并释放所有CUDA内存!因此,对该对象的后续CUDA API调用正在处理悬空引用。

无法相信错过C ++中的小事并花费数小时进行调试是多么容易