2017-10-31 3 views
1

Wie man ein Array in openacc privat machen? Für meine Verwendung habe ich ein Array deklariert, das eine Rekursionsfunktion durchläuft und sich selbst aktualisiert. In C++ Ich habe es auf diese Weise,Private Array, die Rekursion für jede Gruppe in openacc durchläuft

int recursion(int array[],int i) 
{ 
    .... 
    return array[i] = recursion(array,i); 
} 
int main() 
{ 
    .... 
    for(int run=0;run<N;++run) 
    { 
    .... 
     for(int i=0;i<some N;++i) 
     int f = recursion(array,i); 
    } 
..... 
} 

nun das Hauptproblem beginnt, wenn ich versuche, dies parallel zu tun Direktiven OpenACC. Ich möchte dieses Array in die parallele for-Schleife-Region in einer solchen Weise kopieren, dass jede Gruppe eine Kopie dieses Arrays haben wird und in der Lage sein wird, ihre eigene Version von Array [] und nicht die anderen zu ändern, die die Rekursionsfunktion verwenden. Die Art, wie ich versucht, dies zu tun ist

#pragma acc routine seq 
int recursion(int array[],int i) 
{ 
.... 
return array[i] = recursion(array,i); 
} 
int main() 
{ 
.... 
#pragma acc data copyin(array[0:N]) 
#pragma acc parallel loop gang private(array[0:N]) 

for(int run=0;run<N;++run) 
{ 
    .... 
    for(int i=0;i<N;++i) 
    { 
    .... 
    int f = recursion(array,i); 
    } 
    } 
} 

Aber es scheint, dass das Array ist nicht auf die Rekursion Funktion übergeben zu werden, wie ich überprüft haben, dass sie sich nicht verändert. Was ist der perfekte Weg, dies zu tun?

p.s. Ich habe auch versucht #pragma acc data pcreate(array[0:N]) mit #pragma acc parallel loop independent private(array[0:N]) aber das Ergebnis ist das gleiche

Sie können den gesamten Code here finden. Es funktioniert perfekt ohne die Direktiven. Sie müssen nur die Zeile mit curand kommentieren und die Zeile mit rand bei 251 268 Zeile auskommentieren. Bitte Hilfe!

Antwort

1

Ein "privates" Array ist nicht initialisiert, aber Ihr Code erwartet einen Anfangswert. Sie wollen entweder die Arrays innerhalb der Schleife initialisieren, indem wir die "firstprivate" -Klausel verwenden, die jedes private Array mit dem Anfangswert vom Host initialisiert.

Sie haben auch "random" und "ptr" in einer privaten Klausel und einer Datenklausel. Sie sollten sie aus der Daten-Direktive entfernen, da dies sie global macht.

Rekursion auf dem Gerät ist problematisch, da es einen sehr kleinen Stapel auf der GPU gibt (8MB). Sie können dies erhöhen, indem Sie die PGI-Umgebungsvariable "PGI_CUDA_STACKSIZE" auf einen größeren Wert setzen, aber wenn Sie zu tief rekursiv arbeiten, stürzt das Programm ab.

Ich habe versucht, Ihr Programm auszuführen, aber es blieb fehlerbehaftet, vermutlich aufgrund eines Stack-Überlaufs. Ich war mir nicht sicher, welche Eingabewerte verwendet werden sollten, daher könnte es auch ein Pilotfehler sein.

Wenn die Verwendung von "firstprivate" nicht hilft, lassen Sie mich bitte wissen, welche Eingabewerte zu verwenden sind, und ich werde weiter darauf eingehen.

+0

können Sie verwenden Samen 3 vertice Nummer 20000 Bestellnummer 2 Ensemble Nummer 25000 Dateinummer 1 Sie den fout Abschnitt am Ende der Datei Kommentar-, wenn Sie die aus auf einer Datei gespeichert sehen wollen –

+0

mit firstprivate half nicht, auch das Löschen von 'random' und 'ptr' aus Datenanweisungen half nicht. –

+0

Sie können auch Vertex Nummer so klein wie 5000, wenn Sie für eine schnellere Ausführung wollen, erstellt es 3 Dateien, müssen Sie die 'cout' direkt vor dem fout im letzten Teil des Codes auskommentieren, um die Daten im Terminal zu sehen, danke Sie für Ihre Hilfe, bedeutet viel –