Frage

Ich spiele mit Cuda herum.

Im Moment habe ich ein Problem.Ich teste ein großes Array auf bestimmte Antworten, und wenn ich die Antwort erhalte, muss ich die Daten in ein anderes Array kopieren.

Mein Testarray aus 5 Elementen sieht beispielsweise so aus:
[ ][ ][v1][ ][ ][v2]

Das Ergebnis muss so aussehen:
[v1][v2]

Das Problem ist, wie berechne ich die Adresse des zweiten Arrays, um das Ergebnis zu speichern?Alle Elemente des ersten Arrays werden parallel überprüft.

Ich denke darüber nach, eine Gerätevariable int zu deklarieren Adr = 0.Jedes Mal, wenn ich eine Antwort finde, erhöhe ich die Adr.Aber da bin ich mir nicht sicher, weil es das bedeutet Adr Es kann von mehreren Threads gleichzeitig darauf zugegriffen werden.Wird das Probleme verursachen?Oder wartet der Thread, bis ein anderer Thread mit der Verwendung dieser Variablen fertig ist?

War es hilfreich?

Lösung

Ist nicht so trivial, wie es scheint.Ich habe gerade einen implementieren und kann sagen, was Sie müssen Scannen Sie den Gpu Gems 3-Artikel insbesondere Kapitel 39.3.1 Stream-Komprimierung.

Um Ihren eigenen Start mit dem LargeArrayScan-Beispiel im SDK zu implementieren, erhalten Sie nur den Vorscan.Angenommen, Sie haben das Auswahlarray im Gerätespeicher (ein Array aus 1 und 0, was 1 bedeutet: 0 auswählen, verwerfen), dev_selection_array A dev_elements_array Elemente, die ausgewählt werden sollen a dev_prescan_array und ein dev_result_array alle in der Größe N dann tust du es

prescan(dev_prescan_array,dev_selection_array, N);
scatter(dev_result_array, dev_prescan_array,
         dev_selection_array, dev_elements_array, N);

wo die Streuung ist

 __global__ void scatter_kernel( T*dev_result_array, 
                   const T* dev_prescan_array, 
                   const T* dev_selection_array,
                   const T* dev_elements_array, std::size_t size){

unsigned int idx = blockIdx.x * blockDim.x + threadIdx.x;
if (idx >= size) return;
if (dev_selection_array[idx] == 1){
    dev_result_array[dev_prescan_array[idx]] = dev_elements_array[idx];
}
}

Weitere nützliche Anwendungen des Vorscans finden Sie im Artikel Ble93

Viel Spaß!

Andere Tipps

Sie sprechen über die klassische Stream -Verdichtung. Im Allgemeinen würde ich empfehlen, mich anzusehen Schub oder CUDPP (Diese Links gehen zur Verdichtungsdokumentation). Beide sind Open Source. Wenn Sie Ihre eigenen rollen möchten, würde ich auch empfehlen, das SDK -Beispiel von 'Scan' zu betrachten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top