在编译错误时制作 nvcc 输出跟踪
Make nvcc output traces on compile error
我在使用 nvcc 编译一些代码时遇到了一些问题。它严重依赖模板等,因此错误消息很难阅读。例如,目前我收到一条消息
/usr/include/boost/utility/detail/result_of_iterate.hpp:135:338:
error: invalid use of qualified-name
‘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++ 似乎出于某种原因用 "TriggerError::SomethingWentWrong" 替换了 "type" 标记。所以这似乎是一个 CUDA 错误。
nvcc --version: Cuda 编译工具,7.0 版,V7.0.27
gcc --version: gcc (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4
关于主要问题:没有标志或任何东西可以使 nvcc 输出比现有更多的模板信息。显示的错误是语法错误而不是模板实例化错误,但它是由 CUDA 7.0 中的错误引起的。
供参考的bug信息:
该错误仅出现在 CUDA 7.0 中。它在 CUDA 6.5 中不存在,在 CUDA 7.5RC 及更高版本中得到修复。它仅影响 C++11 编译模式(尝试在 C++98 中编译上述代码应该会失败)该错误也仅在 boost 1.5x(可能是 1.50 最新的 1.52)中出现,其中 decltype 用法为 boost::result_of 介绍。一个更简单的例子:
有 3 种可能的解决方法:
- 使用
std::result_of
(c++11)
- 包含
<boost/utility/result_of.hpp>
作为第一个包含
- 使用boost TR1协议并定义
BOOST_RESULT_OF_USE_TR1
我在使用 nvcc 编译一些代码时遇到了一些问题。它严重依赖模板等,因此错误消息很难阅读。例如,目前我收到一条消息
/usr/include/boost/utility/detail/result_of_iterate.hpp:135:338: error: invalid use of qualified-name ‘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++ 似乎出于某种原因用 "TriggerError::SomethingWentWrong" 替换了 "type" 标记。所以这似乎是一个 CUDA 错误。
nvcc --version: Cuda 编译工具,7.0 版,V7.0.27
gcc --version: gcc (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4
关于主要问题:没有标志或任何东西可以使 nvcc 输出比现有更多的模板信息。显示的错误是语法错误而不是模板实例化错误,但它是由 CUDA 7.0 中的错误引起的。
供参考的bug信息:
该错误仅出现在 CUDA 7.0 中。它在 CUDA 6.5 中不存在,在 CUDA 7.5RC 及更高版本中得到修复。它仅影响 C++11 编译模式(尝试在 C++98 中编译上述代码应该会失败)该错误也仅在 boost 1.5x(可能是 1.50 最新的 1.52)中出现,其中 decltype 用法为 boost::result_of 介绍。一个更简单的例子:
有 3 种可能的解决方法:
- 使用
std::result_of
(c++11) - 包含
<boost/utility/result_of.hpp>
作为第一个包含 - 使用boost TR1协议并定义
BOOST_RESULT_OF_USE_TR1