Nsight 2.2有时候工作有时不会

时间:2012-11-12 23:50:48

标签: debugging cuda gpu

我有关于Parallel Nsight 2.2调试器的问题。这很奇怪,我不知道如何描述它。无论如何,它有时有效,有时则无效。

我观察到的是,它适用于动态数组(此数组对cuda_kernels或任何其他功能,如cudaMemcpy atc ...没有影响)以3个元素命名。这是重要的......如果我将尺寸设置为4+,它就会下降,没有错误,没有任何东西会掉下来。

有趣的是,如果我通过正常的调试器孔程序正常运行它可以正确地使用正确的结果。同样有趣的是,将此数组设置为静态

无符号拓扑[4];

并设置相同的值Nsight调试器工作但非常慢。

首先,我评论了所有cuda源代码(如内核和所有cuda函数),但仍然相同 - 它倒下了。所以我开始评论更多的host_code,我发现循环(在主机代码中)做了这个令人毛骨悚然的事情。因此,当Nsght-debug中的程序到达循环(在文本下)时它会掉下来,但是当我在这个循环中编写命令来打印屏幕上每个循环的数字时,它运行,循环完成,孔程序完成然后调试器告诉我:

调试断言失败! 程序: 文件:F:\ DD \ vctools \ crt_bld \ self_x86 \ CRT \ SRC \ dbgheap.c 行:1322

表达式:_CrtIsValidHeapPointer(pUserData)

....我甚至没有磁盘...所以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。

有没有人知道我应该怎么做?

如果有人有任何想法,请告诉我:)

1 个答案:

答案 0 :(得分: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];