0

我有一个简单的内核,我在其中使用 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。

4

1 回答 1

3

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

无法在调试器中检查变量的常见原因之一是编译器优化,无论是在本地(当您不期望时变量超出范围)或全局(已完全优化的变量) .

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

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

于 2013-08-20T13:22:49.137 回答