2015-01-10 10 views
5

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? enter image description hereCUDA: Scatter-Kommunikationsmuster

Antwort

6

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.

4

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.