【问题标题】:Make nvcc output traces on compile error在编译错误时进行 nvcc 输出跟踪
【发布时间】:2015-11-03 14:25:39
【问题描述】:

我在用 nvcc 编译一些代码时遇到了一些麻烦。它严重依赖模板等,因此错误消息难以阅读。例如,目前我正在收到一条消息

/usr/include/boost/utility/detail/result_of_iterate.hpp:135:338: 错误:无效使用限定名 ‘std::allocator_traits<_alloc>::propagate_on_container_swap’

这不是很有帮助。没有关于它来自哪里或模板参数是什么的信息。用例如编译gcc 显示了一些非常好的输出,带有候选和模板参数等。

是否也有可能获得具有 nvcc 的人?或者至少对于主机代码?只用 gcc 编译是不可能的,因为使用了无法消除的 cuda 函数。

这个问题不是关于那个特定的错误,而是关于如何从 nvcc 获取有关任何错误的更多详细信息。这只是一个例子

精简的工作示例(使用 nvcc -std=c++11 编译):

#include <memory>
#include <boost/utility/result_of.hpp>

struct foo{
    int operator()(int x){ return x + 42; }
};
typename boost::result_of < foo(int) >::type
bar(int x){ return foo()(x); }

int main(int argc, char**argv){
  return bar(argc);
}

甚至更少的代码:

template<typename T>
struct TriggerError{

private:
    template<typename _Tp>
    static float helper(_Tp*);
    static int   helper(...);
    typedef decltype(helper((T*)0)) privateWrong;

public:
  typedef privateWrong SomethingWentWrong;
};

#include <boost/utility/result_of.hpp>

struct foo{
    int operator()(int x){ return x + 42; }
};

typename boost::result_of < foo(int) >::type
bar(int x){ return foo()(x); }

int main(int argc, char**argv){
  return bar(argc);
}

看来,cudafe++ 出于某种原因将“type”标记替换为“TriggerError::SomethingWentWrong”。所以这似乎是一个 CUDA 错误。

nvcc --version:Cuda 编译工具,7.0 版,V7.0.27

gcc --version: gcc (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4

【问题讨论】:

  • 请发一个Minimal, Complete, and Verifiable example 生成这样的消息;请同时指定您的 CUDA 和 GCC 版本
  • 实际上,nvcc 在后台使用 gcc 来编译宿主代码,包括 boost 包含文件。 @m.s. 要求的信息。实际上会对其他试图帮助你的人有所帮助。如果您只包含更多的错误输出(您显示的行之前的内容),这甚至会有所帮助。但这一切似乎都不是您想要做的。所以也许其他人会有你正在寻找的答案。
  • 这个 bug 似乎在 cuda 7.5RC 中修复了。
  • 与您所做的 gcc 的比较是似是而非的,因为 gcc 不会对给定文件抛出任何错误。如果您要获取给定文件,并按照 nvcc 在预处理期间的方式对其进行修改,然后尝试按照 nvcc 的方式将其提供给 gcc,我声称您将从 gcc 获得 完全相同的输出。因此,表明 gcc 很棒的比较是从苹果到橘子,因为产生任何类型错误输出的 gcc 测试用例是一个不同的测试用例

标签: c++ cuda compiler-errors nvcc


【解决方案1】:

关于主要问题:没有任何标志或任何东西可以使 nvcc 输出比现有更多的模板信息。显示的错误是语法错误而不是模板实例化错误,但它是由 CUDA 7.0 中的错误引起的。

错误信息供参考:
该错误仅出现在 CUDA 7.0 中。它在 CUDA 6.5 中不存在,在 CUDA 7.5RC 及更高版本中已修复。它仅影响 C++11 编译模式(尝试在 C++98 中编译上述代码应该会失败)该错误也仅在 boost 1.5x(可能是 1.50 最新 1.52)中出现,其中 decltype 用于 boost::result_of被介绍了。一个更简单的例子:Compilation error with nvcc and c++11, need minimal failing example

有 3 种可能的解决方法:

  1. 使用std::result_of (c++11)
  2. &lt;boost/utility/result_of.hpp&gt; 包含为第一个包含
  3. 使用 boost TR1 协议并定义BOOST_RESULT_OF_USE_TR1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2012-01-22
    • 1970-01-01
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多