2017-03-02 4 views
0

In OpenMP kann man Variablen in einer Schleife durchUmgebungsvariablen und OpenACC

#pragma omp parallel for shared(foo) private(bar) 

In OpenACC wir eine private Klausel verwenden den gemeinsamen, aber keine shared Klausel. Es gibt Datensätze wie copy, copyin, copyout auf der anderen Seite.

Manchmal verwenden wir Beschleuniger, die ihren eigenen Speicher haben, aber auch auf den gemeinsamen Speicher zugreifen können.

In so einem Fall möchten wir vielleicht, dass der Beschleuniger verhindert, dass die Daten in seinen eigenen privaten Speicher kopiert und auf der Instanz im gemeinsamen Speicher bearbeitet werden.

Wie können wir OpenACC mitteilen, dass die Daten nicht kopiert werden sollen?

Antwort

1

Beachten Sie, dass Arrays standardmäßig freigegeben sind.

Die Klausel "create" data erstellt die Daten auf dem Gerät, führt jedoch keine Kopie durch.

Wenn Sie Daten verwenden möchten, die bereits auf dem Gerät erstellt wurden, z. B. über cudaMalloc oder acc_malloc, können Sie die Dateneinheit "deviceptr" verwenden, um den Compiler anzuweisen, die Adresse des Zeigers im Gerätecode zu verwenden -Verwenden Sie den Gerätezeiger in der aktuellen Tabelle unter Verwendung der Host-Adresse.

Wenn Sie eine Gerätevariable mit einer Hostvariablen verknüpfen möchten, können Sie den API-Aufruf "acc_map_data" verwenden.

Es klingt, als ob Sie einen größeren Speicherpool haben, den Sie dann wiederverwenden möchten. In diesem Fall können Sie den Speicherpool mit einer OpenACC-Datenklausel cudaMalloc oder acc_malloc erstellen. Wenn Sie eine Datenklausel verwenden, rufen Sie "acc_deviceptr" auf, um die Gerätezeigeradresse abzurufen. Als Nächstes können Sie "acc_map_data" verwenden, um einen Hostzeiger mit dem Gerätezeiger zu verknüpfen. Beachten Sie, dass die zugeordneten Daten eine Teilmenge des größeren Gerätepools sein können und Sie einem Offset zuordnen können, d. H. "Devptr + offset".

Für ein Beispiel zur Verwendung von "acc_map_data" siehe: https://github.com/rmfarber/ParallelProgrammingWithOpenACC/blob/master/Chapter05/acc_map.c