Ich lerne CUDA von der Udacity course auf parallele Programmierung. In einem Quiz haben sie ein Problem beim Sortieren einer vorrangigen Variablen (Spielerhöhe). Da es eine Eins-eins-Entsprechung zwischen Eingabe- und Ausgabearray ist, sollte es kein Map
Kommunikationsmuster anstelle eines Scatter
sein? CUDA: Scatter-Kommunikationsmuster
Antwort
CUDA macht keine kanonische Definition dieser Begriffe, die ich kenne. Daher ist meine Antwort lediglich ein Vorschlag, wie es interpretiert werden könnte.
„Da es eine Eins-eins-Entsprechung zwischen Eingangs- und Ausgangsarray“
Diese Feststellung wird nicht durch das Diagramm unterstützt werden, die Lücken in der Ausgangsanordnung zeigt, die keinen entsprechenden Eingang haben Punkt mit ihnen verbunden.
Wenn eine kleinere Menge von Werten in eine größere Anordnung verteilt ist (mit dem daraus resultierenden Lücken in der Ausgangsanordnung, also in dem kein Eingangswert an den Spalte Stelle entspricht (n)), dann ein scatter könnte verwendet werden, um diese Operation zu beschreiben. Sowohl Scatters als auch Maps haben Maps, die beschreiben, wo die Eingabewerte gehen, aber es könnte sein, dass der Instructor Scatter und Map so definiert hat, dass zwischen diesen beiden Fällen unterschieden werden kann:
Scatter : Eins-zu-Eins-Beziehung von Eingang zur Ausgabe (dh unidirektionale Beziehung). Jeder Eingabeort hat einen entsprechenden Ausgabeort, aber nicht jeder Ausgabeort hat einen entsprechenden Eingabeort.
Karte: eins-zu-eins-Beziehung zwischen Eingang und Ausgang (dh. Bidirektionale Beziehung). Jeder Eingabeort hat einen entsprechenden Ausgabeort, und Jeder Ausgabeort hat einen entsprechenden Eingabeort.
Sammeln: eins-zu-eins-Beziehung von Ausgang zur Eingabe (dh Unidirektional-Beziehung). Jeder Ausgabeort hat einen entsprechenden Eingabeort, aber nicht jeder Eingabeort hat einen entsprechenden Ausgabeort.
Die Definition jedes Kommunikationsmusters (Map, Scatter, Gather, etc.) variiert leicht von einer Sprache/Umgebung/Kontext zu einer anderen, aber da ich denselben Udacity Kurs verfolgt habe, werde ich versuchen diesen Begriff zu erklären ich verstehe es im Rahmen des Kurses:
der Map
Betrieb jedes Ausgangselement als eine Funktion seines berechnet Eingabeelementes entspricht, das heißt:
output[tid] = foo(input[tid]);
die Gather
Muster jedes Ausgangselement als berechnet Funktion Ionen eines oder mehrerer (normalerweise mehr) Eingabeelemente, nicht notwendigerweise des entsprechenden (typischerweise sind dies Elemente aus einer Nachbarschaft). Zum Beispiel:
output[tid] = (input[tid-1] + input[tid+1])/2;
Schließlich sind der Scatter
Betrieb hat jedes Eingangselement zu einem beitragen oder mehr (auch hier in der Regel mehr) Ausgangselemente.Zum Beispiel
atomicAdd(&(output[tid-1]), input[tid]);
atomicAdd(&(output[tid]), input[tid]);
atomicAdd(&(output[tid+1]), input[tid]);
Das Beispiel in der Frage gegeben ist eindeutig nicht eine Karte, weil jeder Ausgang von einem Eingang an einem anderen Ort berechnet wird.
Es ist auch schwer zu sehen, wie das gleiche Beispiel eine Streuung sein kann, weil jedes Eingabeelement nur einen Schreibvorgang zur Ausgabe verursacht, aber es ist in der Tat eine Streuung, da jede Eingabe einen Schreibvorgang an einen Ausgang verursacht, dessen Position ist bestimmt durch die Eingabe.
Mit anderen Worten verarbeitet jeder CUDA-Thread ein Eingabeelement an der Position, die seiner tid
(Thread-ID-Nummer) zugeordnet ist, und berechnet, wo das Ergebnis geschrieben werden soll. Meistens würde eine Streuung an mehreren Stellen statt nur an einer Stelle schreiben, also ist dies ein spezieller Fall, der genauso gut anders benannt werden könnte.
Jeder Spieler hat 3 Eigenschaften (Name, Größe, Rang). Also ich denke, Streu ist richtig, weil wir diese drei Dinge betrachten sollten, um die Ausgabe zu machen.
Wenn Spieler hat nur eine Eigenschaft wie Rang, dann Karte ist richtig, denke ich.
reference: Parallel Communication Patterns Recap in this lecture
- 1. CUDA Zufallsgenerierung
- 2. CUDA bandwidthTest.cu
- 3. CUDA Speicherzuweisungsleistung
- 4. CUDA Bildverarbeitungsfehler
- 5. CUDA Gegenbuchstabe
- 6. CUDA Fehler in Matlab (alle CUDA-fähige Geräte beschäftigt sind)
- 7. CMake + Cuda: cpp-Dateien in Cuda-Modus kompilieren (-X = cu)
- 8. CUDA Compiler (nvcc) Makro
- 9. Nsight Eclipse Cuda + opencv
- 10. Konstanten mit CUDA verwenden
- 11. Raytracing mit CUDA
- 12. Bit-Array in CUDA
- 13. CUDA Particle Update
- 14. Lerne Nvidia CUDA
- 15. CUDA Installation unter Windows
- 16. CUDA Brute Force Spaß
- 17. Summe 3D-Matrix cuda
- 18. CUDA Reduzierung Optimierungen
- 19. Cuda Verschiedene Speicherzuordnungen
- 20. Cuda Thrust min_element stürzt
- 21. CUDA - PTX Übertrag Ausbreitung
- 22. CUDA Warp Execution Efficiency
- 23. Cuda atomare Operationen
- 24. Cuda registriert pro Thread
- 25. Verschachtelte Kernel in CUDA
- 26. Cuda-Programm auf VMware
- 27. cuda thread Indexierung
- 28. CUDA konstanten Speicherbänke
- 29. CUDA: Zusammenfassung der Ergebnisse
- 30. Bedingte Reduktion in CUDA