OpenACC

OpenACC
안정화 버전
3.3 / 2022년 11월(3년 전)(2022-11)
프로그래밍 언어C, C++, 포트란
운영 체제크로스 플랫폼
플랫폼크로스 플랫폼
종류API
웹사이트www.openacc.org

OpenACC(open accelerators)는 크레이, CAPS, 엔비디아, PGI가 개발한 병렬 컴퓨팅을 위한 프로그래밍 표준이다. 이 표준은 이기종 CPU/GPU 시스템의 병렬 프로그래밍을 단순하게 만들기 위해 설계된 것이다.

OpenMP에서처럼 프로그래머는 C, C++, 포트란 소스 코드를 어노테이션 처리하여 컴파일러 디렉티브와 추가 함수를 사용하여 가속하면 좋을 영역을 식별할 수 있다. OpenMP 4.0 이상에서처럼 OpenACC는 CPU와 GPU 아키텍처를 둘 다 대상으로 하여 이들 위에 연산 코드를 실행할 수 있다.

OpenACC 멤버들은 OpenMP 표준 그룹의 멤버로서 OpenMP 사양에 병합되기 위해 노력해 왔으며, 이를 통해 향후 OpenMP 릴리스에서 가속기를 지원하도록 OpenMP를 확장하는 공통 사양을 만들고자 했다. 이러한 노력의 결과로 연례 슈퍼컴퓨팅 컨퍼런스(2012년 11월, 솔트레이크시티)에 맞춰 논평 및 토론을 위한 기술 보고서가 발표되었으며, OpenMP에 참여하는 하드웨어 공급업체들의 의견을 반영하여 엔비디아가 아닌 가속기 지원 문제를 다루게 되었다.

ISC’12에서 OpenACC는 성능 데이터 없이 엔비디아, AMD, 인텔 가속기에서 작동하는 모습이 시연되었다.

2012년 11월 12일, SC12 컨퍼런스에서 OpenACC 버전 2.0 사양 초안이 발표되었다. 새로 제안된 기능에는 데이터 이동에 대한 향상된 제어(비정형 데이터의 더 나은 처리 및 비연속 메모리 지원 개선 등), 명시적 함수 호출 및 분리 컴파일(가속 코드로 된 라이브러리의 생성 및 재사용 허용)에 대한 지원이 포함되었다. OpenACC 2.0은 2013년 6월에 공식적으로 릴리스되었다.

사양의 버전 2.5는 2015년 10월에 릴리스되었으며, 버전 2.6은 2017년 11월에 릴리스되었다. 이후 버전 2.7이 2018년 11월에 릴리스되었다.

최신 버전은 2022년 11월에 릴리스된 버전 3.3이다.

컴파일러 지원

OpenACC에 대한 지원은 PGI(버전 12.6부터)와 (Cray 하드웨어 전용으로) Cray의 상용 컴파일러에서 이용할 수 있다.

OpenUH는 휴스턴 대학교의 HPCTools 그룹이 개발한, C와 포트란을 지원하는 Open64 기반의 오픈 소스 OpenACC 컴파일러이다.

OpenARC는 오크리지 국립연구소에서 개발된 오픈 소스 C 컴파일러로, OpenACC 1.0 사양의 모든 기능을 지원한다. 실험적인 오픈 소스 컴파일러인 accULL은 라라구나 대학교에서 개발되었다(C (프로그래밍 언어)만 지원).

Omni Compiler는 일본 쓰쿠바 대학의 HPCS 연구실과 이화학연구소 계산과학센터의 프로그래밍 환경 연구팀이 개발한 오픈 소스 컴파일러로, OpenACC를 지원하며 XcalableMP와 OpenACC를 결합한 XcalableMP(일본어판) 및 XcalableACC(일본어판)를 지원한다.

IPMACC는 빅토리아 대학교 (캐나다)에서 개발한 오픈 소스 C 컴파일러로, OpenACC를 CUDA, OpenCL 및 ISPC로 번역한다. 현재는 data, kernels, loop, cache 지시어만 지원된다.

GCC의 OpenACC 지원은 더디게 진행되었다. 2013년 9월, 삼성에서 GPU를 대상으로 하는 구현이 발표되었으며, 이는 OpenACC 1.1 주석 코드를 OpenCL로 번역했다. "실질적인" 구현 발표는 2개월 후 엔비디아에 의해 이루어졌으며, OpenACC 2.0에 기반을 두었다. 이 구현은 사용 가능한 오픈 소스 어셈블러나 런타임이 없는 엔비디아 자체의 PTX 어셈블리어만을 대상으로 했기 때문에 논란이 일었다. OpenACC/PTX에 대한 실험적 지원은 GCC 5.1 버전부터 포함되었다. GCC6 및 GCC7 릴리스 시리즈에는 OpenACC 2.0a 사양에 대한 훨씬 향상된 구현이 포함되었다. GCC 9.1은 거의 완벽한 OpenACC 2.5 지원을 제공한다.

사용

동종 시스템에서의 OpenMP 3.x나 이전의 OpenHMPP와 유사하게, OpenACC의 주된 프로그래밍 방식은 지시어 사용이다. 사양에는 여러 지원 함수를 정의하는 런타임 라이브러리도 포함되어 있다. 이를 활용하기 위해 사용자는 C에서는 "openacc.h", 포트란에서는 "openacc_lib.h"를 포함해야 하며, acc_init() 함수를 호출해야 한다.

지시어

OpenACC는 광범위한 프라그마(지시어) 목록을 정의하며, 예시는 다음과 같다.

#pragma acc parallel
#pragma acc kernels

둘 다 서로 다른 의미론을 사용하여 가속기에서 실행될 병렬 계산 커널을 정의하는 데 사용된다.

#pragma acc data

가속기로 데이터를 복사하거나 가속기에서 데이터를 가져오는 주요 지시어이다.

#pragma acc loop

parallel 또는 kernels 영역 내의 병렬성 유형을 정의하는 데 사용된다.

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

런타임 API

정의된 몇 가지 런타임 API 함수도 있다: 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는 일반적으로 대상 장치에 대한 작업 구성을 처리하지만, gang(갱)과 worker(워커)를 사용하여 이를 재정의할 수 있다. 갱은 워커들로 구성되며 여러 처리 요소에 걸쳐 작동한다(OpenCL의 작업 그룹과 유사함).

같이 보기

각주

  1. ↑ “Nvidia, Cray, PGI, and CAPS launch ‘OpenACC’ programming standard for parallel computing”. 《The Inquirer》. 2011년 11월 4일. 2011년 11월 17일에 원본 문서에서 보존된 문서. 2020년 3월 4일에 확인함.
  2. ↑ “OpenACC standard version 2.5” (PDF). 《OpenACC.org》. 2017년 6월 2일에 확인함.
  3. ↑ “How does the OpenACC API relate to the OpenMP API?”. 《OpenACC.org》. 2014년 1월 14일에 확인함.
  4. ↑ “How did the OpenACC specifications originate?”. 《OpenACC.org》. 2014년 1월 14일에 확인함.
  5. ↑ “The OpenMP Consortium Releases First Technical Report”. 《OpenMP.org》. 2012년 11월 5일. 2014년 1월 14일에 확인함.
  6. ↑ “OpenMP at SC12”. 《OpenMP.org》. 2012년 8월 29일. 2014년 1월 14일에 확인함.
  7. 1 2 “OpenACC Group Reports Expanding Support for Accelerator Programming Standard”. 《HPCwire》. 2012년 6월 20일. 2012년 6월 23일에 원본 문서에서 보존된 문서. 2014년 1월 14일에 확인함.
  8. ↑ “OpenACC Version 2.0 Posted for Comment”. 《OpenACC.org》. 2012년 11월 12일. 2014년 1월 14일에 확인함.
  9. ↑ “OpenACC 2.0 Spec | www.openacc.org”. 《www.openacc.org》. 2016년 4월 4일에 원본 문서에서 보존된 문서. 2016년 3월 23일에 확인함.
  10. ↑ “OpenACC Standards Group Announces Release of the 2.5 Specification; Member Vendors Add Support for ARM & x86 as Parallel Devices | www.openacc.org”. 《www.openacc.org》. 2016년 3월 22일에 확인함.
  11. ↑ “What's new in OpenACC 2.6? | OpenACC” (영어). 《www.openacc.org》. 2018년 5월 1일에 확인함.
  12. ↑ “What's new in OpenACC 2.7! | OpenACC” (영어). 《www.openacc.org》. 2019년 1월 7일에 확인함.
  13. ↑ “The OpenACC© Application Programming Interface” (PDF). 《OpenACC》. November 2022. 2023년 1월 25일에 원본 문서 (PDF)에서 보존된 문서. 2025년 2월 24일에 확인함.
  14. ↑ “OpenACC Standard to Help Developers to Take Advantage of GPU Compute Accelerators”. 《Xbit laboratories》. 2011년 11월 16일. 2014년 1월 16일에 원본 문서에서 보존된 문서. 2014년 1월 14일에 확인함.
  15. ↑ “OpenUH Compiler”. 2014년 1월 25일에 원본 문서에서 보존된 문서. 2014년 3월 4일에 확인함.
  16. ↑ “OpenARC Compiler”. 2014년 11월 4일에 원본 문서에서 보존된 문서. 2014년 11월 4일에 확인함.
  17. 1 2 Larabel, Michael (2013년 9월 30일). “GCC Support Published For OpenACC On The GPU”. 《Phoronix》.
  18. ↑ “accULL The OpenACC research implementation”. 2014년 1월 14일에 확인함.
  19. ↑ “Omni Compiler”. 《omni-compiler.org》. 2019년 11월 18일에 확인함.
  20. ↑ 《Omni Compiler for C and Fortran programs with XcalableMP and OpenACC directives: omni-compiler/omni-compiler》, omni-compiler, 2019년 10월 17일, 2019년 11월 17일에 확인함
  21. ↑ “IPMACC Compiler”. 《깃허브》. 2017년 1월 31일에 확인함.
  22. ↑ Larabel, Michael (2012년 12월 4일). “OpenACC Still Not Loved By Open Compilers”. 《Phoronix》.
  23. ↑ Larabel, Michael (2013년 11월 14일). “OpenACC 2.0 With GPU Support Coming To GCC”. 《Phoronix》.
  24. ↑ Larabel, Michael (2013년 11월 15일). “NVIDIA, Mentor Graphics May Harm GCC”. 《Phoronix》.
  25. ↑ Larabel, Michael (2013년 11월 21일). “In-Fighting Continues Over OpenACC In GCC”. 《Phoronix》.
  26. ↑ “OpenACC - GCC Wiki”.
  27. ↑ Schwinge, Thomas (2015년 1월 15일). “Merge current set of OpenACC changes from gomp-4_0-branch” (메일링 리스트). 《gcc》. 2015년 1월 15일에 확인함 – gcc.gnu.org 경유.
  28. ↑ Jelinek, Jakub (2019년 5월 3일). “GCC 9.1 Released”. 《LWN.net》.
  29. ↑ “Easy GPU Parallelism with OpenACC”. 《Dr.Dobb's》. 2012년 6월 11일. 2014년 1월 14일에 확인함.
  30. ↑ “OpenACC API QuickReference Card, version 1.0” (PDF). 《NVidia》. November 2011. 2014년 1월 14일에 확인함.
  31. ↑ “OpenACC standard version 2.0” (PDF). 《OpenACC.org》. 2014년 1월 14일에 확인함.
  32. ↑ “OpenACC Kernels and Parallel Constructs”. 《PGI insider》. August 2012. 2014년 1월 14일에 확인함.
  33. ↑ “OpenACC parallel section VS kernels”. 《CAPS entreprise Knowledge Base》. 2013년 1월 3일. 2014년 1월 16일에 원본 문서에서 보존된 문서. 2014년 1월 14일에 확인함.

외부 링크