使用VS-can'进行CUDA调试;t检查\uuuu限制\uuuuu指针(操作无效)

使用VS-can'进行CUDA调试;t检查\uuuu限制\uuuuu指针(操作无效),cuda,nsight,Cuda,Nsight,我有一个简单的内核,其中我使用malloc分配一些空间,简单如下: __global__ void chainKernel() { float* __restrict__ boo = (float*)malloc(sizeof(float)); *boo = 0; *boo = *boo + 100; return; } 如果我在*boo=*boo+100上设置断点,我就看不到*boo的内容。相反,由于调试器窗口中变量旁边的对象的当前状态,我获取操作无效。但是,

我有一个简单的内核,其中我使用malloc分配一些空间,简单如下:

__global__ void chainKernel() {
    float* __restrict__ boo = (float*)malloc(sizeof(float));
    *boo = 0;
    *boo = *boo + 100;
    return;
}
如果我在
*boo=*boo+100
上设置断点,我就看不到*boo的内容。相反,由于调试器窗口中变量旁边的对象的当前状态,我获取
操作无效。但是,如果我删除了
\uuuuu restrict\uuuu
,该值将正确显示。这是正常的行为吗


我的系统:CUDA 5.5.20、Nsight 3.1.0.13141、Windows 7 x64、VS2010、GeForce GTX Titan。

限制的好处之一是它允许编译器在优化时更积极。如果您有这样的简单代码,编译器可以完全优化,那么
\uuuuu restrict\uuuu
关键字可能会帮助编译器完成这项工作

无法在调试器中检查变量的一个常见原因是编译器进行了局部优化(当您不期望它时,变量超出范围)或全局优化(已完全优化的变量)

请注意,您在这个问题中给出的内核定义没有任何用处。因此,编译器可能正在优化某些东西


要解决这个问题(对于本例),请放置一个
printf(“%f”,*boo)boo
赋值之后立即执行code>语句,编译器将无法优化变量。您还应该使用
-G
开关进行调试。

\uuuuuuuuuuuuuuu
的好处之一是它允许编译器更积极地进行优化。如果您有这样的简单代码,编译器可以完全优化,那么
\uuuuu restrict\uuuu
关键字可能会帮助编译器完成这项工作

无法在调试器中检查变量的一个常见原因是编译器进行了局部优化(当您不期望它时,变量超出范围)或全局优化(已完全优化的变量)

请注意,您在这个问题中给出的内核定义没有任何用处。因此,编译器可能正在优化某些东西


要解决这个问题(对于本例),请放置一个
printf(“%f”,*boo)boo
赋值之后立即执行code>语句,编译器将无法优化变量。您还应该使用
-G
开关进行调试。

不确定,但
\uuuu restrict\uuuu
关键字的要点是避免指针别名,可能需要创建别名。。。我猜这是正常的行为。@Michael:所以如果我想调试,我必须重新定义
\define\uuuu restrict\uuuu
?不确定,但
\uu restrict\uuu
关键字的目的是避免指针别名,可能需要创建别名。。。我猜这是正常的行为。@Michael:所以如果我想调试,我必须重新定义
\define\uu restrict\uu