1

我有关于 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。

有谁知道我应该怎么做?

请让我知道是否有人有任何想法:)

4

1 回答 1

2

错误

Debug Assertion Failed! Program: File:f:\dd\vctools\crt_bld\self_x86\crt\src\dbgheap.c Line: 1322 

来自 Microsoft C 运行时函数_CrtIsValidHeapPointer。默认调试版本在代码中添加了额外的堆和堆栈检查。该函数用于验证指定的指针是否在本地堆中。路径 f:... 是 C 运行时中源文件的位置。此功能是在 Microsoft 构建库时。

断言表示内存访问越界。错误的原因似乎是topologyOfKernels的分配不正确。

corruption.topologyOfKernels = new kernelTopology_ [numberOfLayersInput - 1];

应该分配numberofLayersInput元素。

corruption.topologyOfKernels = new kernelTopology_ [numberOfLayersInput];
于 2012-11-13T15:41:30.560 回答