cudaMemCpy2d error (cudaErrorInvalidValue) 运行时"debug"配置

cudaMemCpy2d error (cudaErrorInvalidValue) when running "debug" configuration

本文关键字:debug 配置 运行时 error cudaErrorInvalidValue cudaMemCpy2d      更新时间:2023-10-16

这让我发疯了。我一辈子都想不通为什么会这样。基本上,我的这段代码在Linux(Nsight eclipse版(下运行良好。我尝试通过创建Visual Studio 2013项目并对其进行配置来使其与Windows兼容。

在这一点上,一切似乎都很好,代码编译没有任何问题。当我使用"发布"配置时,它甚至可以正常运行。但是,一旦我尝试调试配置,下面的部分就会崩溃并显示cudaErrorInvalidValue错误。
我已经将问题追踪到优化标志。禁用优化将导致崩溃。使用 /O2/O1 ,代码运行良好!

同样,这在有或没有优化的 Linux 下工作得很好。我想知道Windows优化有什么。如果有任何帮助,我正在使用带有CUDA 6.5和静态库链接的Visual Studio 2013(更新4(。(在Linux上是CUDA 6.5,但动态库链接(。

完整代码可在此处获得。

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);

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

简直不敢相信在C++中错过一些微小的东西并花费数小时进行调试是多么容易