1

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

一切正常,所以我的问题是如何使用“快速监视”或“添加监视”来查看您可以在普通 VS 中执行的变量,它们在 NSight 中的等价物是什么?谢谢,已经挣扎了几个小时了。

通过 NSight 进行调试时,我有 CUDA Info 窗口和 CUDA Warp 窗口仅显示 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 从未设置过。怎么会这样?谢谢你

PS当他们看到我的问题时,那些给我缺点的人总是放弃我得到-1。再次感谢

4

3 回答 3

2

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

为了查看特定线程的值,您必须设置一个条件断点,其中条件定义为对感兴趣的特定线程 ID 为真。

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

  1. 演练:调试 CUDA 应用程序
  2. 设置 GPU 断点
  3. 查看变量
于 2014-04-16T03:03:39.267 回答
1

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

于 2013-02-10T22:03:13.607 回答
0

在具有 Compute Capability 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
}
于 2014-04-15T19:32:49.007 回答