Was ich versuche zu tun:Wie man relationalen Join auf zwei Datencontainern auf GPU (vorzugsweise CUDA) durchführen?
Auf der GPU, ich versuche die Konventionen von SQL in der relationalen Algebra verwendet nachzuahmen schließt sich auf Tabellen auszuführen (z Inner Join, Outer Join, Kreuz verbinden). Im folgenden Code möchte ich einen Inner Join ausführen. Stellen Sie sich zwei Tabellen (Container) vor, in denen eine Tabelle die Eltern/Master-Tabelle und die andere die Child-Tabelle ist. Die Join-Beziehung Parent zu Child ist 1 zu viele (oder 1 zu keine), falls in Child_ParentIDs kein Element vorhanden ist, das mit einem Element in Parent_IDs übereinstimmt.
Beispiel Eingabedaten:
Parent_IDs: [1, 2, 3, 4, 5] ... 5 elements
Parent_Values: [0, 21, 73, 0, 91] ... 5 elements
Child_ParentIDs: [1, 1, 1, 2, 3, 5, 5] ... 7 elements
Child_Permanences: [120, 477, 42, 106, 143, 53, 83] ... 7 elements
Child_Values: [0, 0, 0, 0, 0, 0, 0] ... 7 elements
Betrieb als SQL-Abfrage:
SELECT child.permanence * parent.value FROM child, parent WHERE child.parent_id = parent.id;
Betriebsbeschreibung:
Join Child_ParentIDs zu Parent_IDs die entsprechenden Parent_Values zuzugreifen. Verwenden Sie die entsprechenden Parent_Values, um sie mit den entsprechenden Child_Permanances zu multiplizieren, und platzieren Sie das Ergebnis jeder Operation in Child_Values.
Erwarteter Ausgang (Child_Values ist das einzige geänderte Vektor während des Betriebs):
Child_ParentIDs: [1, 1, 1, 2, 3, 5, 5] ... 7 elements
Child_Permanences: [120, 477, 42, 106, 143, 53, 83] ... 7 elements
Child_Values: [0, 0, 0, 2226, 10439, 4823, 7553] ... 7 elements
Erläuterung (falls es nicht sinnvoll, DID): abgeleitet ist
Der Wert von 2226 mit 106 multipliziert wird und 21. 10439 ergibt sich aus Multiplikation von 143 und 73. Beachten Sie auch, dass ALLE Einträge auf den untergeordneten Vektoren erhalten bleiben (alle 7 Elemente existieren noch in der Ausgabe, wenn auch einzelne Elemente von Child_Values aktualisiert werden). Die übergeordnete Vektoren werden in der Ausgabe nicht beibehalten (Notice ParentID 4 fehlt in der Liste der Vektoren und es gibt keinen "Dummy" -Platzhalter dafür). Dies ist das Verhalten eines "Inner Join".
Ideen von eleganten Lösungen, die ich nicht zur Arbeit bekommen habe:
-Utilizing CUDA Dynamic Parallelism. Vielleicht ist die einzige Lösung im gesamten Internet, die ich gefunden habe, genau das, was ich versuche zu tun ist here-part 1 und here-part 2.
-Verwendung der Hash-Operationen von CUDPP;
-Alenka DB.
Und schließlich meine Frage wiederholte:
Gibt es eine Arbeitslösung aus einer rein GPU Perspektive (vorzugsweise mit CUDA, aber OpenCL funktionieren würde) zur Durchführung Relational schließt sich auf zwei getrennte Behälter von Daten, so dass die Daten können über diese Joins gesucht und Elemente parallel aktualisiert werden?
EDIT
Parent_IDs wird nicht immer eine Folge sein. Während der Laufzeit können Elemente aus den übergeordneten Vektoren entfernt werden. Neu eingefügten Elternelementen wird immer eine ID angehängt, die von der ID des letzten Elements aus gesetzt wird. Wenn ich das gesagt habe, verstehe ich, dass Child-Elemente verwaist sein können, aber ich gehe hier nicht auf die Lösung ein.
TL; DR: Fragen Sie wirklich nur, ob es eine Standardlösung dafür gibt? – talonmies
Wenn Sie nichts davon lesen möchten, dann zeigen Sie mich auf eine Standardlösung. Ich werde es meinen Bedürfnissen anpassen und hier aktualisieren. – aiwyn
Ich denke, dass Sie eine Lösung basierend auf der Lösung in http://stackoverflow.com/a/34371396/5153458 – eg0x20