使用nvcc编译代码时遇到了一些麻烦。它严重依赖于模板等,因此很难读取错误消息。例如,目前我收到了一条消息
/usr/include/boost/utility/detail/result_of_iterate.hpp:135:338: 错误:无效使用qualified-name “的std :: allocator_traits< _Alloc> :: propagate_on_container_swap”
这不是很有帮助。没有关于它来自何处或模板参数是什么的信息。用例如编译gcc显示了一些非常好的输出,包括候选和模板参数等。
无论如何有可能获得nvcc的人吗?或者至少对于主机代码?只有使用无法消除的cuda函数,才能用gcc编译。
这个问题不是关于那个特定的错误,而是关于如何从任何错误的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
答案 0 :(得分:3)
关于主要问题:没有任何标志或任何使nvcc输出比现有模板信息更多的模板信息。显示的错误是语法错误而不是模板实例化错误,但它是由CUDA 7.0中的错误引起的。
有关错误的信息以供参考:
该错误仅发生在CUDA 7.0中。它不在CUDA 6.5中,并且已在CUDA 7.5RC及更高版本中修复。它只影响C ++ 11编译模式(尝试在C ++ 98中编译上面的代码应该失败)这个bug也只发生在boost 1.5x(可能是1.50最新的1.52)中,其中boost :: result_of的decltype用法被介绍了。一个更简单的例子:Compilation error with nvcc and c++11, need minimal failing example
有三种可能的解决方法:
std::result_of
(c ++ 11)<boost/utility/result_of.hpp>
作为第一个包含BOOST_RESULT_OF_USE_TR1