随着CUDA 8 + GCC 5,unordered_map与串键布设编译失败

问题描述:

考虑下面的代码:随着CUDA 8 + GCC 5,unordered_map与串键布设编译失败

#include <string> 
#include <unordered_map> 

int main() 
{ 
    std::string s("hello"); 
    std::unordered_map<std::string, int> map; 
    map.emplace(s, 123); 
    return 0; 
} 

此生成细跟:

  • GCC 4.9.3,没有CUDA
  • GCC 5.3.1,否CUDA
  • GCC 4.9.3 via CUDA 7.5(带有文件扩展名.cu)
  • GCC 4.9.3 via CUDA 8 RC(带有文件扩展名nsion.cu)

无法通过CUDA 8 RC与GCC 5.3.1编译

我得到的错误是:

/usr/include/c++/5/bits/hashtable.h(1526): error: no instance of overloaded function "std::forward" matches the argument list 
      argument types are: (std::__cxx11::string) 
      detected during: 
      instantiation of "std::pair<std::_Hashtable<_Key, _Value, _Alloc, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, _Traits>::iterator, __nv_bool> std::_Hashtable<_Key, _Value, _Alloc, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, _Traits>::_M_emplace(std::true_type, _Args &&) [with _Key=std::__cxx11::string, _Value=std::pair<const std::__cxx11::string, int>, _Alloc=std::allocator<std::pair<const std::__cxx11::string, int>>, _ExtractKey=std::__detail::_Select1st, _Equal=std::equal_to<std::__cxx11::string>, _H1=std::hash<std::__cxx11::string>, _H2=std::__detail::_Mod_range_hashing, _Hash=std::__detail::_Default_ranged_hash, _RehashPolicy=std::__detail::_Prime_rehash_policy, _Traits=std::__umap_traits<true>, _Args=<std::__cxx11::string &, int>]" 
(726): here 
      instantiation of "std::_Hashtable<_Key, _Value, _Alloc, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, _Traits>::__ireturn_type std::_Hashtable<_Key, _Value, _Alloc, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, _Traits>::emplace(_Args &&...) [with _Key=std::__cxx11::string, _Value=std::pair<const std::__cxx11::string, int>, _Alloc=std::allocator<std::pair<const std::__cxx11::string, int>>, _ExtractKey=std::__detail::_Select1st, _Equal=std::equal_to<std::__cxx11::string>, _H1=std::hash<std::__cxx11::string>, _H2=std::__detail::_Mod_range_hashing, _Hash=std::__detail::_Default_ranged_hash, _RehashPolicy=std::__detail::_Prime_rehash_policy, _Traits=std::__umap_traits<true>, _Args=<std::__cxx11::string &, int>]" 
/usr/include/c++/5/bits/unordered_map.h(380): here 
      instantiation of "std::pair<std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::iterator, __nv_bool> std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::emplace(_Args &&...) [with _Key=std::__cxx11::string, _Tp=int, _Hash=std::hash<std::__cxx11::string>, _Pred=std::equal_to<std::__cxx11::string>, _Alloc=std::allocator<std::pair<const std::__cxx11::string, int>>, _Args=<std::__cxx11::string &, int>]" 
a.cu(8): here 

1 error detected in the compilation of "/tmp/tmpxft_00003494_00000000-9_a.cpp1.ii". 

这是一个错误CUDA?如果没有,为什么会发生这种情况?

+2

在这里有一个实际的问题吗?这看起来像一个错误报告,不像一个问题。我怀疑它应该是前者,而不是后者。 – talonmies

+0

最后一个适当的MCVE。 – einpoklum

是的,这是一个错误CUDA:

I交叉张贴了这个问题devtalk.nvidia.com,并直接提交正式的错误报告。然后我提交了CUDA bug 1774129(可能需要登录)。

NVIDIA开发者凯文·康已经确认了昨天的错误,他说:

嗨,我们已经局部再现这个问题,我们在编译器团队的开发人员都在积极修复工作这个问题。一旦进一步的信息变得可用,我们会在这里发布。

当他们修复它时,我会编辑这个答案。

编辑:它已被修复! ...但不在CUDA 8.0 RC当然。我想/希望这个修补程序能够进入CUDA 8最终版。