我想知道有没有办法查看给定内核中的所有变量值,例如,对于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。再次感谢
答案 0 :(得分:2)
Nsight VSE CUDA调试器支持几乎所有Visual Studio调试器工具窗口,包括变量视图,监视窗口,内存视图,调用堆栈视图和断点视图。这些可以从Debug |打开Visual Studio中的Windows菜单。
为了查看特定线程的值,您必须设置一个条件断点,并为所关注的特定线程ID定义条件为真。
请参阅Nsight VSE手册中的以下主题
答案 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
}