2016-05-29 34 views
-1

Betrachten Sie den folgenden Code zu kompilieren:Mit CUDA 8 + gcc 5, unordered_map mit String-Schlüssel emplace nicht

#include <string> 
#include <unordered_map> 

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

Dies baut fein mit:

  • GCC 4.9.3, ohne CUDA
  • GCC 5.3.1, keine CUDA
  • GCC 4.9.3 via CUDA 7,5 (mit der Dateierweiterung .cu)
  • GCC 4.9.3 via CUDA 8 RC (mit Datei EXTE nsion .cu)

aber nicht mit GCC 5.3.1 via CUDA 8 RC kompilieren.

Der Fehler, den ich bekommen ist:

/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". 

Ist das ein Fehler CUDA? Wenn nicht, warum würde das passieren?

+2

Gibt es irgendwo eine Frage? Das liest sich wie ein Fehlerbericht, nicht wie eine Frage. Ich vermute, dass es ersteres und nicht letzteres sein sollte. – talonmies

+0

Endlich ein richtiger MCVE. – einpoklum

Antwort

1

Ja, das ist ein CUDA Fehler:

ich diese Frage Cross gebucht devtalk.nvidia.com und richtete einen offiziellen Fehlerbericht einreichen. Ich habe dann CUDA bug 1774129 eingereicht (Login kann erforderlich sein).

nVIDIA Entwickler Kevin Kang hat den Fehler gestern bestätigt, sagt:

Hallo, wir dieses Problem vor Ort reproduziert haben, und unsere Entwickler in Compiler Team an einer Lösung arbeiten aktiv für dieses Problem. Wir werden Sie hier auf dem Laufenden halten, sobald die weiteren Informationen verfügbar sind.

Wenn sie es beheben, werde ich diese Antwort bearbeiten.

Bearbeiten: Es wurde behoben! ... aber nicht auf CUDA 8.0 RC natürlich. Ich nehme an/hoffe, dass dieses Update es in CUDA 8 Finale schafft.