-1

这真让我抓狂。我一生都无法弄清楚为什么会发生这种情况。基本上,我的这段代码在 Linux(Nsight eclipse 版)下运行良好。我尝试通过创建 Visual Studio 2013 项目并对其进行配置使其与 Windows 兼容。

此时一切似乎都很好,代码编译没有任何问题。当我使用“发布”配置时,它甚至运行良好。但是,一旦我尝试调试配置,下面的部分就会崩溃并出现cudaErrorInvalidValue错误。
我已经将问题追溯到优化标志。禁用优化将导致崩溃。使用/O2or /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);
4

1 回答 1

3

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

无法相信在 C++ 中遗漏一些微小的东西并花费数小时进行调试是多么容易

于 2014-12-19T03:02:56.523 回答