如何在VS 2010中使用Nvidia NSight查看CUDA线程值?

时间:2013-02-10 14:37:14

标签: c cuda nvidia nsight

我想知道有没有办法查看给定内核中的所有变量值,例如,对于threadIdx.x = 1,它当前正在处理哪些数据以及该数据的值是多少?

一切正常,所以我的问题是如何看到你可以在普通VS中做的变量,使用“快速观看”或“添加手表”,它们在NSight中的等价物是什么? 谢谢你,现在已经挣扎了几个小时。

我有CUDA信息窗口和CUDA Warp窗口,在通过NSight进行调试时只显示blockIdx,threadIDx坐标。

   __global__ void addKernel(int *c, const int *a, const int *b)
{
    int i = threadIdx.x;

    if(i<N)
        c[i]=a[i]*b[i];
    // DUmmy code
    if(i<2)
    int k=i;
}

我的内核被称为addKernel<<<1,N>>>(dev_c,dev_a,dev_b)和我的#DEFINE N 10。

我把断点放在if和else里面。 Warp窗口中的输出设置为显示:

*(a+i)  *(b+i)  *(c+i)  i

 0          0     -1     0
 2          1     -1     1
 4          4     -1     2
 6          9     -1     3
 8         16     -1     4

所以,我的c从未设置过。怎么会这样? 谢谢

P.S。那些给我弊端的家伙总是会在他们看到我的问题时放弃 - 我得到-1。再次感谢

3 个答案:

答案 0 :(得分:2)

Nsight VSE CUDA调试器支持几乎所有Visual Studio调试器工具窗口,包括变量视图,监视窗口,内存视图,调用堆栈视图和断点视图。这些可以从Debug |打开Visual Studio中的Windows菜单。

为了查看特定线程的值,您必须设置一个条件断点,并为所关注的特定线程ID定义条件为真。

请参阅Nsight VSE手册中的以下主题

  1. Walkthrough: Debugging a CUDA Application
  2. Set GPU Breakpoint
  3. View Variables

答案 1 :(得分:1)

在我的内核中添加一些虚拟线后,我能够看到列c的值已更新。所以,这就是解决方案。我知道这听起来微不足道,但我之前尝试添加虚拟线,除非额外的虚拟线是其他变量,而不是用于计算c的线程,否则它不起作用。因此,简而言之,计算新线程(或者内核中的任何新线程),并在您希望在CUDA Warp窗口中看到的变量之后添加那些额外的线。

答案 2 :(得分:0)

在计算能力2.1(c [i] = 0)的555m gt上有同样的问题。 具有Compute Capability 3.0的GTX 660显示正确的值,但有时c [i] = -1。

对于“虚拟”线,它在任何情况下都可以正常工作(行c [i] = c [i]中的断点)。

__global__ void addKernel(int *c, const int *a, const int *b)
{
    int i = threadIdx.x;
    c[i] = a[i] + b[i]; //if breakpoint will be here c[i] = -1 or 0
    c[i] = c[i]; //breakpoint here guarantees c[i] is correct
}