使用VS-can'进行CUDA调试;t检查\uuuu限制\uuuuu指针(操作无效)
我有一个简单的内核,其中我使用malloc分配一些空间,简单如下:使用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的内容。相反,由于调试器窗口中变量旁边的对象的当前状态,我获取操作无效。但是,
__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
?