【问题标题】:CUDA debugging with VS - can't examine __restrict__ pointers (Operation is not valid)使用 VS 进行 CUDA 调试 - 无法检查 __restrict__ 指针(操作无效)
【发布时间】:2013-08-22 09:22:20
【问题描述】:

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

【问题讨论】:

  • 不确定,但__restrict__ 关键字的意义在于避免指针别名,也许NSight 需要创建别名……我猜这是正常行为。
  • @Michael:所以如果我想调试我必须重新定义#define __restrict__?

标签: cuda nsight


【解决方案1】:

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

无法在调试器中检查变量的常见原因之一是编译器优化,无论是局部的(变量超出了您的预期范围)还是全局的(变量已经完全优化了)。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    • 2015-11-17
    相关资源
    最近更新 更多