我在自己的笔记本电脑上编写了一个 CUDA 程序,该笔记本电脑配有 Nvidia GTX 960M。该代码运行没有任何问题。我还实现了错误检查,可以在此线程中找到: What is the canonical way to check for error using the CUDA Runtime API?
并使用 测试了代码cuda-memcheck
,报告了 0 个错误。
我想在具有 Nvidia Titan X 的服务器上测试我的代码。但是cudaPeekAtLastError()
会抛出错误:
illegal memory access was encountered
Run Code Online (Sandbox Code Playgroud)
对于我的笔记本电脑和服务器,我使用以下堆分配
cudaDeviceSetLimit(cudaLimitMallocHeapSize, 1024 * 1024 * 1024);
Run Code Online (Sandbox Code Playgroud)
并运行以下线程和块:
int blockSize = 128;
int numBlocks = (nPossibilities + blockSize - 1) / blockSize;
Run Code Online (Sandbox Code Playgroud)
GTX 960M 的计算能力为 5,而 Titan X 的计算能力为 6.1,但根据计算能力表(维基百科),两者都最多有 32 个活动块,每个多处理器最多有 2048 个线程。
我cuda-memcheck
在服务器上运行了,非法内存访问的问题是由于空指针造成的。
为了解决这个问题,我使用以下几行将堆内存大小分配从 1GB 增加到 …