| 안정화 버전 | 3.3
/ 2022년 11월 |
|---|---|
| 프로그래밍 언어 | C, C++, 포트란 |
| 운영 체제 | 크로스 플랫폼 |
| 플랫폼 | 크로스 플랫폼 |
| 종류 | API |
| 웹사이트 | www |
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 함수도 있다: 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의 작업 그룹과 유사함).