Erstellen Sie eine verknüpfte Liste mit CUDA
Ist es möglich, erstellen Sie eine verknüpfte Liste, die auf einer GPU mit CUDA?
Ich bin versucht, dies zu tun und ich bin encoutering einige Schwierigkeiten.
Wenn ich nicht zuordnen dynamische Speicher in einen CUDA-kernel, dann wie kann ich erstellen Sie einen neuen Knoten und fügt ihn der verlinkten Liste?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dass Sie wirklich nicht wollen, dies zu tun, wenn Sie können helfen - das beste, was Sie tun können, wenn Sie nicht bekommen kann Weg von verketteten Listen ist, Sie zu emulieren über arrays und array-Indizes verwenden, eher als Anregung für deine links.
Gibt es einige Valide Anwendungsfälle für die verlinkten Listen auf einer GPU. Erwägen Sie die Verwendung einer Skip-Liste als alternative, da Sie einen schnelleren Betrieb. Es gibt Beispiele von stark konkurrierenden Skip-Liste algorithmen zur Verfügung, die per Google-Suche.
Schauen Sie sich diesen link http://www.cse.iitk.ac.in/users/mainakc/lockfree.html/
für die CUDA-code eine PDF-Datei und PPT-Präsentation auf eine Reihe von lock frei CUDA Datenstrukturen.
Link-Listen konstruiert werden können, die parallel mit einer Reduktion Algorithmus Ansatz. Dies setzt Voraus, dass ALLE Mitglieder bekannt sind, in der Bauzeit. Jeder thread beginnt mit der Verbindung von 2 Knoten. Dann die Hälfte der threads schließen Sie die 2-Knoten-Segmente zusammen, und so weiter, wodurch die Anzahl der threads nach 2 jede iteration. Dies wird eine Liste aufbauen, in log2 N Zeit.
Speicherzuweisung ist eine Einschränkung. Pre-allocate alle Knoten in einem array auf dem host. Dann können Sie die array-Indizes an Stelle von Zeigern. Das hat den Vorteil, dass die Liste traversal ist gültig auf der GPU und dem host.
Für die Parallelität, die Sie verwenden müssen, CUDA Atomare Operationen. Atomic hinzufügen/Inkrement zur Anzahl der Knoten aus dem Knoten-array und Vergleichen und wechseln um die verbindungen zwischen den Knoten.
Wieder sorgfältig betrachten Sie den Anwendungsfall und den Zugang Muster. Mit einer großen Link-Liste ist sehr Seriell. Mit 100 - - 100-der kleine Link-Liste ist mehr parallel. Ich erwarte, dass der Speicher zugreifen, werden uncoalesced, es sei denn, darauf geachtet wird, reservieren Sie verbundenen Knoten in benachbarten Speicherstellen.
Stimme ich mit Paul, verlinkte Listen sind ein sehr 'seriellen' Denkweise. Vergessen Sie, was Sie gelernt haben, über die serielle Operationen und tun Sie einfach alles auf einmal : )
werfen Sie einen Blick auf Schub für die Art und Weise der gemeinsamen Operationen