OpenACC

OpenACC
Wersja stabilna
2.7 / Listopad 2018 ; 4 lata temu ( 2018-11 )
Napisane w C , C++ i Fortranie
System operacyjny Międzyplatformowe
Platforma Międzyplatformowe
Typ API
Strona internetowa www.openacc.org _ _

OpenACC (dla otwartych akceleratorów ) to standard programowania dla obliczeń równoległych opracowany przez firmy Cray , CAPS, Nvidia i PGI . Standard ma na celu uproszczenie programowania równoległego heterogenicznych systemów CPU / GPU .

Podobnie jak w OpenMP , programista może dodawać adnotacje do kodu źródłowego C , C++ i Fortran , aby zidentyfikować obszary, które powinny zostać przyspieszone za pomocą dyrektyw kompilatora i dodatkowych funkcji. Podobnie jak OpenMP 4.0 i nowsze, OpenACC może celować zarówno w CPU , jak i GPU i uruchamiać na nich kod obliczeniowy.

Członkowie OpenACC pracowali jako członkowie grupy standardów OpenMP, aby połączyć się ze specyfikacją OpenMP, aby stworzyć wspólną specyfikację, która rozszerza OpenMP o obsługę akceleratorów w przyszłej wersji OpenMP. Wysiłki te zaowocowały opracowaniem raportu technicznego do skomentowania i dyskusji, który obejmował doroczną konferencję Supercomputing Conference (listopad 2012 r., Salt Lake City ) i dotyczył obsługi akceleratorów innych niż Nvidia, przy uwzględnieniu informacji od dostawców sprzętu, którzy uczestniczą w OpenMP.

Na ISC'12 wykazano, że OpenACC działa na akceleratorach Nvidia , AMD i Intel , bez danych dotyczących wydajności.

12 listopada 2012 r. na konferencji SC12 został zaprezentowany projekt specyfikacji OpenACC w wersji 2.0. Nowe sugerowane możliwości obejmują nowe kontrole nad ruchem danych (takie jak lepsza obsługa danych nieustrukturyzowanych i ulepszenia w obsłudze pamięci nieciągłej) oraz obsługa jawnych wywołań funkcji i oddzielnej kompilacji (umożliwiając tworzenie i ponowne wykorzystywanie bibliotek przyspieszonego kodu). OpenACC 2.0 został oficjalnie wydany w czerwcu 2013 roku.

Wersja 2.5 specyfikacji została wydana w październiku 2015 roku, natomiast wersja 2.6 została wydana w listopadzie 2017 roku. Najnowsza wersja specyfikacji, wersja 2.7, została wydana w listopadzie 2018 roku.

Wsparcie kompilatora

Obsługa OpenACC jest dostępna w komercyjnych kompilatorach firmy PGI (od wersji 12.6) oraz (tylko dla sprzętu Cray) Cray.

OpenUH to kompilator open source OpenACC oparty na Open64 , obsługujący C i FORTRAN, opracowany przez grupę HPCTools z University of Houston .

OpenARC to kompilator C typu open source opracowany w Oak Ridge National Laboratory w celu obsługi wszystkich funkcji specyfikacji OpenACC 1.0. Eksperymentalny kompilator typu open source, accULL, został opracowany przez Uniwersytet La Laguna ( tylko język C ).

Omni Compiler to kompilator typu open source opracowany w HPCS Laboratory. z University of Tsukuba i Programming Environment Research Team z RIKEN Center for Computational Science w Japonii wsparli OpenACC, XcalableMP [ ja ] i XcalableACC [ ja ] łącząc XcalableMP i OpenACC.

IPMACC to kompilator C typu open source opracowany przez University of Victoria , który tłumaczy OpenACC na CUDA, OpenCL i ISPC. Obecnie obsługiwane są tylko następujące dyrektywy: data , kernels , loop i cache .

GCC dla OpenACC było powolne. Implementacja kierowania na GPU firmy Samsung została ogłoszona we wrześniu 2013 r .; ten przetłumaczony kod z adnotacjami OpenACC 1.1 na OpenCL . Ogłoszenie „prawdziwej” implementacji nastąpiło dwa miesiące później, tym razem od NVIDII i opartej na OpenACC 2.0. Wywołało to pewne kontrowersje, ponieważ implementacja dotyczyłaby tylko PTX firmy NVIDIA język asemblera, dla którego nie był dostępny asembler ani środowisko wykonawcze typu open source. Eksperymentalne wsparcie dla OpenACC/PTX trafiło do GCC od wersji 5.1. Serie wydań GCC6 i GCC7 zawierają znacznie ulepszoną implementację specyfikacji OpenACC 2.0a. GCC 9.1 oferuje prawie pełną obsługę OpenACC 2.5.

Stosowanie

W sposób podobny do OpenMP 3.x w systemie jednorodnym lub wcześniejszego OpenHMPP , podstawowym trybem programowania w OpenACC są dyrektywy. Specyfikacje obejmują również bibliotekę wykonawczą definiującą kilka funkcji pomocniczych. Aby je wykorzystać, użytkownik powinien dołączyć „openacc.h” w C lub „openacc_lib.h” w Fortranie; a następnie wywołaj acc_init() .

dyrektywy

OpenACC definiuje obszerną listę pragm (dyrektyw), na przykład:


 #pragma acc równolegle  #pragma acc jądra 

Oba są używane do definiowania jąder obliczeń równoległych, które mają być wykonywane w akceleratorze, przy użyciu odrębnej semantyki

#pragma acc data

Jest główną dyrektywą do definiowania i kopiowania danych do iz akceleratora.

#pragma acc pętla

Służy do definiowania typu równoległości w regionie równoległym lub jądra .




 #pragma acc cache  #pragma acc update  #pragma acc deklaracja  #pragma acc wait 

Interfejs API środowiska wykonawczego

kilka funkcji API środowiska wykonawczego: 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 generalnie zajmuje się organizacją pracy dla urządzenia docelowego, jednak można to obejść, korzystając z gangów i pracowników. Gang składa się z pracowników i działa na wielu elementach przetwarzających (jak w przypadku grupy roboczej w OpenCL).

Zobacz też

Linki zewnętrzne