我有关于 Parallel Nsight 2.2 调试器的问题。这很奇怪,我不知道如何描述它。无论如何,它有时有效,有时无效。
我观察到的是,它适用于以 3 个元素命名的动态数组(该数组对 cuda_kernels 或任何其他函数(如 cudaMemcpy atc ...)没有影响)。这很重要......如果我将大小设置为 4+,它就会掉下来,没有错误,什么都没有掉下来。
有趣的事实是,如果我通过正常的调试器孔程序正常运行它,则可以正常工作并获得正确的结果。另一个有趣的事实是,当将此数组设置为静态时
无符号拓扑[4];
并设置相同的值 Nsight 调试器工作但非常缓慢。
所以首先我评论了所有 cuda 源代码(如内核和所有 cuda 函数),但仍然相同 - 它失败了。所以我开始评论更多的host_code,我发现循环(在主机代码中)做了这个令人毛骨悚然的事情。因此,当 Nsght-debug 中的程序到达循环(在文本下)时,它会掉下来,但是,当我在此循环中编写命令以在屏幕上打印每个循环的编号时,它会运行,循环完成,孔程序完成,然后调试器告诉我:
调试断言失败!程序:文件:f:\dd\vctools\crt_bld\self_x86\crt\src\dbgheap.c 行:1322
表达式:_CrtIsValidHeapPointer(pUserData)
....我什至没有磁盘f ...所以wtf???
无论如何,在普通调试器上它运行良好并且结果正确。
这是提到循环和动态数组*拓扑:
unsigned *topology;
unsigned numberOfLayersInput = 5;
topology = new unsigned [numberOfLayersInput];
topology[0] = 784;
topology[1] = 1000;
topology[2] = 800;
topology[3] = 300;
topology[4] = 10;
kernelTopology_ *topologyOfKernels;
topologyOfKernels = new kernelTopology_ [numberOfLayersInput - 1];
for (int i = 0, numberOfThreads; i < numberOfLayersInput; i++)
{
cout <<i << endl; // this is the added line!
numberOfThreads = fixedTopology[i];
topologyOfKernels[i].size = numberOfThreads;
if(numberOfThreads > THREADS_PER_BLOCK)
topologyOfKernels[i].BLOCK_SIZE = THREADS_PER_BLOCK;
else topologyOfKernels[i].BLOCK_SIZE = numberOfThreads;
if(numberOfThreads <= THREADS_PER_BLOCK)
topologyOfKernels[i].GRID_SIZE = 1;
else if(fixedTopology[i] % topologyOfKernels[i].BLOCK_SIZE == 0)
topologyOfKernels[i].GRID_SIZE = fixedTopology[i] / topologyOfKernels[i].BLOCK_SIZE;
else
topologyOfKernels[i].GRID_SIZE = (fixedTopology[i] / topologyOfKernels[i].BLOCK_SIZE) + 1;
}
我在这段代码中看不到任何错误......正常的调试器也没有问题。
我已经重新安装了图形驱动程序、CUDA 工具包、CUDA SDK 和 Paralell Nsight,但它做了同样令人毛骨悚然的事情。顺便说一句,我使用 Win 7 64 位和 VS2010。
有谁知道我应该怎么做?
请让我知道是否有人有任何想法:)