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

Posted

技术标签:

【中文标题】如何在 VS 2010 中使用 Nvidia NSight 查看 CUDA 线程值?【英文标题】:How to see CUDA thread value using Nvidia NSight in VS 2010? 【发布时间】:2013-01-25 18:26:35 【问题描述】:

我想知道有没有办法查看给定内核中的所有变量值,例如,对于 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&lt;&lt;&lt;1,N&gt;&gt;&gt;(dev_c,dev_a,dev_b)and my #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 从未设置过。为何如此? 谢谢

附:那些给我缺点的人在看到我的问题时总是会放弃吗?我得到-1。再次感谢

【问题讨论】:

http.developer.nvidia.com/NsightVisualStudio/2.2/Documentation/… 是的,我知道 CUDA Info and Warp 窗口在哪里,但是当我设置断点时它不会显示变量。这是代码和输出 你好,现在可以看看吗,谢谢 对您的问题投反对票的人促使您对其进行编辑并从中提出更好的问题。所以我会说系统正在运行。在大多数情况下,您放置在 warp 窗口中的 watch 表达式似乎也可以正常工作。当你设置断点时,你是在哪里设置的(即在哪一行)?如果您走到内核的末尾,您的监视窗口是否会更新 c[i] 的修改值?如果这很难做到,请在内核末尾放置一段虚拟代码(例如 printf 或你有什么)并在那里设置一个断点。然后检查 c[i] 不,我的监视窗口不会在内核末尾更新值,但是在添加上面标记的虚拟行之后,我现在可以看到输出。谢谢,我怎么给你积分,最后一个问题;-)? 【参考方案1】:

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

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

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

    Walkthrough: Debugging a CUDA Application Set GPU Breakpoint View Variables

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

使用 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

【讨论】:

以上是关于如何在 VS 2010 中使用 Nvidia NSight 查看 CUDA 线程值?的主要内容,如果未能解决你的问题,请参考以下文章

Nvidia Nsight - 如何连接到本地主机?

在 JavaScript 比较中应该使用哪个等号运算符(== vs ===)?

在 JavaScript 比较中应该使用哪个等号运算符(== vs ===)?

在 JavaScript 比较中应该使用哪个等号运算符(== vs ===)?

在 JavaScript 比较中应该使用哪个等号运算符(== vs ===)?

在 JavaScript 比较中应该使用哪个等号运算符(== vs ===)?