使用VS进行CUDA调试 - 无法检查__restrict__指针(操作无效)

时间:2013-08-20 10:48:59

标签: cuda nsight

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

__global__ void chainKernel() {
    float* __restrict__ boo = (float*)malloc(sizeof(float));
    *boo = 0;
    *boo = *boo + 100;
    return;
}

如果我在*boo = *boo + 100上设置断点,我看不到* boo的内容。相反,我在调试器窗口中的变量旁边得到Operation is not valid due to the current state of the object。但是,如果我删除__restrict__,则会正确显示该值。这是正常行为吗?

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

1 个答案:

答案 0 :(得分:3)

__restrict__的一个好处是它允许编译器更积极地进行优化。当你有这样的简单代码,编译器可以完全优化时,__restrict__关键字可以帮助编译器做到这一点。

无法在调试器中检查变量的一个常见原因是编译器优化,可以是本地的(当你没有预期时变量超出范围)或全局(变量已经完全)优化了。)

请注意,您在此问题中显示的内核定义没有任何用处。因此编译器可能正在优化事物。

要解决此问题(对于本例),请在最终printf("%f", *boo);赋值后立即放置boo语句,编译器将无法优化变量。您还应该使用-G开关进行调试。