OpenACC - OpenACC

OpenACC
Stabile Version
2.7 / November 2018
Geschrieben in C , C++ und Fortran
Betriebssystem Plattformübergreifend
Plattform Plattformübergreifend
Typ API
Webseite www .openacc .org

OpenACC (für offene Beschleuniger ) ist ein Programmierstandard für paralleles Rechnen, der von Cray , CAPS, Nvidia und PGI entwickelt wurde . Der Standard soll die parallele Programmierung von heterogenen CPU / GPU- Systemen vereinfachen .

Wie in OpenMP kann der Programmierer C- , C++- und Fortran- Quellcode annotieren , um die Bereiche zu identifizieren, die mit Compiler-Direktiven und zusätzlichen Funktionen beschleunigt werden sollen . Wie OpenMP 4.0 und neuer kann OpenACC sowohl auf die CPU- als auch auf die GPU- Architekturen abzielen und darauf Computercode starten.

OpenACC-Mitglieder haben als Mitglieder der OpenMP-Standardgruppe daran gearbeitet, sich in die OpenMP-Spezifikation einzufügen, um eine gemeinsame Spezifikation zu erstellen, die OpenMP erweitert, um Beschleuniger in einer zukünftigen Version von OpenMP zu unterstützen. Diese Bemühungen führten zu einem technischen Bericht für Kommentare und Diskussionen, der auf die jährliche Supercomputing-Konferenz (November 2012, Salt Lake City ) abgestimmt war und die Unterstützung von Nicht-Nvidia-Beschleunigern mit Beiträgen von Hardwareanbietern, die an OpenMP teilnehmen, ansprach.

Auf der ISC'12 wurde gezeigt, dass OpenACC auf Nvidia- , AMD- und Intel- Beschleunigern ohne Leistungsdaten funktioniert .

Am 12. November 2012 wurde auf der SC12-Konferenz ein Entwurf der Spezifikation OpenACC Version 2.0 vorgestellt. Zu den neuen vorgeschlagenen Funktionen gehören neue Kontrollen über die Datenverschiebung (wie z. B. eine bessere Handhabung unstrukturierter Daten und Verbesserungen bei der Unterstützung für nicht zusammenhängenden Speicher) sowie Unterstützung für explizite Funktionsaufrufe und separate Kompilierung (ermöglicht die Erstellung und Wiederverwendung von Bibliotheken mit beschleunigtem Code). OpenACC 2.0 wurde offiziell im Juni 2013 veröffentlicht.

Version 2.5 der Spezifikation wurde im Oktober 2015 veröffentlicht, während Version 2.6 im November 2017 veröffentlicht wurde. Die neueste Version der Spezifikation, Version 2.7, wurde im November 2018 veröffentlicht.

Compiler-Unterstützung

Unterstützung von OpenACC ist in kommerziellen Compilern von PGI (ab Version 12.6) und (nur für Cray-Hardware) von Cray verfügbar.

OpenUH ist ein Open64- basierter Open-Source-OpenACC-Compiler, der C und FORTRAN unterstützt und von der HPCTools-Gruppe der University of Houston entwickelt wurde .

OpenARC ist ein Open-Source-C-Compiler, der am Oak Ridge National Laboratory entwickelt wurde , um alle Funktionen der OpenACC 1.0-Spezifikation zu unterstützen. Ein experimenteller Open-Source-Compiler, accULL, wird von der Universität von La Laguna ( nur Sprache C ) entwickelt.

Omni Compiler ist ein Open-Source-Compiler, der im HPCS-Labor entwickelt wurde. von der University of Tsukuba und dem Programming Environment Research Team des RIKEN Center for Computational Science, Japan, unterstützten OpenACC, XcalableMP  [ ja ] und XcalableACC  [ ja ] in Kombination von XcalableMP und OpenACC.

IPMACC ist ein Open-Source-C-Compiler, der von der University of Victoria entwickelt wurde und OpenACC in CUDA, OpenCL und ISPC übersetzt. Derzeit werden nur die folgenden Direktiven unterstützt: data , kernels , loop und cache .

Die GCC- Unterstützung für OpenACC ließ nur langsam auf sich warten. Eine GPU-Targeting-Implementierung von Samsung wurde im September 2013 angekündigt; dieser übersetzte OpenACC 1.1-annotierte Code in OpenCL . Zwei Monate später folgte die Ankündigung einer "echten" Implementierung, diesmal von NVIDIA und auf Basis von OpenACC 2.0. Dies löste einige Kontroversen aus, da die Implementierung nur auf NVIDIAs eigene PTX- Assemblersprache abzielen würde , für die kein Open-Source-Assembler oder Runtime verfügbar war. Experimentelle Unterstützung für OpenACC/PTX landete in GCC ab Version 5.1. Die Release-Serien GCC6 und GCC7 enthalten eine stark verbesserte Implementierung der OpenACC 2.0a-Spezifikation. GCC 9.1 bietet nahezu vollständige OpenACC 2.5-Unterstützung.

Verwendungszweck

Ähnlich wie OpenMP 3.x auf einem homogenen System oder das frühere OpenHMPP ist der primäre Programmiermodus in OpenACC Direktiven. Zu den Spezifikationen gehört auch eine Laufzeitbibliothek , die mehrere Unterstützungsfunktionen definiert. Um sie auszunutzen, sollte der Benutzer "openacc.h" in C oder "openacc_lib.h" in Fortran einbinden; und rufen Sie dann die Funktion acc_init() auf .

Richtlinien

OpenACC definiert eine umfangreiche Liste von Pragmas (Direktiven), zum Beispiel:

#pragma acc parallel
#pragma acc kernels

Beide werden verwendet, um parallele Rechenkerne zu definieren, die auf dem Beschleuniger ausgeführt werden sollen, unter Verwendung unterschiedlicher Semantik

#pragma acc data

Ist die Hauptanweisung zum Definieren und Kopieren von Daten zum und vom Beschleuniger.

#pragma acc loop

Wird verwendet, um die Art der Parallelität in einer Region paralleloder zu definieren kernels.

#pragma acc cache
#pragma acc update
#pragma acc declare
#pragma acc wait

Laufzeit-API

Es sind auch einige Laufzeit- API- Funktionen definiert: acc_get_num_devices(), acc_set_device_type(), acc_get_device_type(), acc_set_device_num(), acc_get_device_num(), acc_async_test(), acc_async_test_all(), acc_async_wait(), acc_async_wait_all(), acc_init(), acc_shutdown(), acc_on_device(), acc_malloc(), acc_free().

OpenACC kümmert sich im Allgemeinen um die Arbeitsorganisation für das Zielgerät, dies kann jedoch durch den Einsatz von Banden und Arbeitern außer Kraft gesetzt werden. Eine Gang besteht aus Arbeitern und arbeitet über eine Reihe von Verarbeitungselementen (wie bei einer Arbeitsgruppe in OpenCL).

Siehe auch

Verweise

Externe Links