2012-03-28 13 views
1

Ich schreibe einen CUDA-Kernel, in dem ich den string-Datentyp in C++ verwende. Jedoch wird der Compiler den folgenden Fehler zu werfen:Können String-Datentypen in C++ - CUDA-Kernel verwendet werden?

error: calling a host function("std::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator =") from a __device__/__global__ function("doDecompression") is not allowed 

sind Strings nicht in einem Kernel erlaubt? Wenn nicht, wie umgehen Sie die Zuweisung von Speicherplatz für ein char-Array innerhalb eines Kernels?

+0

Verwenden Sie C-Zeichenfolgen in Kernelfunktionen –

+0

@PaulR: Angenommen, ich übergebe ein Array von C++ - Zeichenfolgen an meinen Kernel. CUDA beklagt sich nicht darüber. Wie wirke ich dies in eine C-Zeichenfolge innerhalb des Kernels. Bitte geben Sie Beispiel – Programmer

+0

Sie müssen nur die zugrunde liegenden Daten an den Kernel übergeben - verwenden Sie die 'string :: c_str()' Methode, um Zeiger auf die C-Daten im Host-Code zu extrahieren und diese an die Kernel-Funktion übergeben –

Antwort

4

Sie können den Typ C++ string nicht in einem Kernel verwenden, da CUDA keine Geräteversion der C++ String-Bibliothek enthält, die auf der GPU ausgeführt werden könnte. Selbst wenn es möglich wäre, string in einem Kernel zu verwenden, ist es nicht etwas, was Sie tun möchten, weil string Speicher dynamisch verarbeitet, was wahrscheinlich langsam wäre.

Erstellen Sie stattdessen ein Array von Strings mit fester Länge und kopieren Sie die Strings dorthin. Dann kopiere das Array auf die GPU. Übergeben Sie die Basisadresse des Arrays von Strings an Ihren Kernel und lassen Sie jeden Thread die Adresse zu einer gegebenen Zeichenfolge berechnen, indem Sie einen Offset basierend auf seinem Index zur Basisadresse hinzufügen.

Verwandte Themen