我有一个简单的内核,我在其中使用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。
答案 0 :(得分:3)
__restrict__
的一个好处是它允许编译器更积极地进行优化。当你有这样的简单代码,编译器可以完全优化时,__restrict__
关键字可以帮助编译器做到这一点。
无法在调试器中检查变量的一个常见原因是编译器优化,可以是本地的(当你没有预期时变量超出范围)或全局(变量已经完全)优化了。)
请注意,您在此问题中显示的内核定义没有任何用处。因此编译器可能正在优化事物。
要解决此问题(对于本例),请在最终printf("%f", *boo);
赋值后立即放置boo
语句,编译器将无法优化变量。您还应该使用-G
开关进行调试。