1. 소개
이 문서에서는 C 및 C++ 프로그램에서 공유 메모리 병렬 처리를 지정하는 데 사용할 수 있는 컴파일러 지시문, 라이브러리 함수 및 환경 변수 컬렉션을 지정합니다. 이 문서에 설명된 기능을 통칭하여 OpenMP C/C++ API(애플리케이션 프로그램 인터페이스)라고 합니다. 이 사양의 목표는 여러 공급업체의 공유 메모리 아키텍처에서 프로그램을 이식할 수 있는 병렬 프로그래밍 모델을 제공하는 것입니다. 많은 공급업체의 컴파일러는 OpenMP C/C++ API를 지원합니다. OpenMP Fortran 애플리케이션 프로그램 인터페이스를 비롯한 OpenMP에 대한 자세한 내용은 다음 웹 사이트에서 확인할 수 있습니다.
이 문서에 정의된 지시문, 라이브러리 함수 및 환경 변수를 사용하면 이식성을 허용하면서 병렬 프로그램을 만들고 관리할 수 있습니다. 지시문은 단일 프로그램 SPMD(다중 데이터) 구문, 작업 공유 구문 및 동기화 구문을 사용하여 C 및 C++ 순차 프로그래밍 모델을 확장합니다. 또한 데이터의 공유 및 민영화를 지원합니다. OpenMP C 및 C++ API를 지원하는 컴파일러에는 모든 OpenMP 컴파일러 지시문을 활성화하고 해석할 수 있는 명령줄 옵션이 컴파일러에 포함됩니다.
1.1 범위
이 사양은 컴파일러와 런타임 시스템이 프로그램을 병렬로 실행하는 데 수행하는 작업을 명시적으로 정의하는 사용자 지정 병렬 처리만 다룹니다. OpenMP C 및 C++ 구현은 종속성, 충돌, 교착 상태, 경합 상태 또는 잘못된 프로그램 실행을 초래하는 기타 문제를 확인할 필요가 없습니다. OpenMP C 및 C++ API 구문을 사용하는 애플리케이션이 올바르게 실행되는지 확인해야 합니다. 컴파일러에서 생성된 자동 병렬화 및 이러한 병렬 처리를 지원하기 위한 컴파일러에 대한 지시문은 이 문서에서 다루지 않습니다.
1.2 용어 정의
이 문서에는 다음과 같은 용어가 사용 됩니다.
barrier
팀의 모든 스레드가 도달해야 하는 동기화 지점입니다. 각 스레드는 팀의 모든 스레드가 이 시점에 도착할 때까지 대기합니다. 지시문으로 식별되는 명시적 장벽과 구현에서 만든 암시적 장벽이 있습니다.
construct
구문은 문입니다. 지시문과 구조화된 블록으로 구성됩니다. 일부 지시문은 구문의 일부가 아닙니다. 부록 C의 openmp 지시문을 참조하세요.
지시문
C 또는 C++
#pragma
뒤에 식별자, 다른 텍스트 및 새 줄이 잇omp
습니다. 지시문은 프로그램 동작을 지정합니다.동적 익스텐트
어휘 익스텐트의 모든 문과 어휘 범위 내에서 문이 실행된 결과로 실행되는 함수 내의 모든 문입니다. 동적 익스텐트를 지역이라고도 합니다.
어휘 익스텐트
구조화된 블록 내에서 어휘적으로 보관되는 문입니다.
마스터 스레드
병렬 영역을 입력할 때 팀을 만드는 스레드입니다.
병렬 지역
OpenMP 병렬 구문에 바인딩되고 많은 스레드에서 실행할 수 있는 문입니다.
private
프라이빗 변수는 참조를 만드는 스레드에 고유한 스토리지 블록의 이름을 지정합니다. 변수가 프라이빗임을 지정하는 여러 가지 방법이 있습니다. 즉, 병렬 영역 내의 정의, 지시문,
threadprivate
지시문,private
,firstprivate
lastprivate
절 또는reduction
지시문 바로 다음for
parallel for
루프에서for
변수를 루프 제어 변수로for
사용합니다.region
동적 익스텐트입니다.
직렬 지역
병렬 영역의 동적 익스텐트 외부에 있는 마스터 스레드에서만 실행되는 문입니다.
serialize
다음을 사용하여 병렬 구문을 실행하려면:
단일 스레드(해당 병렬 구문의 마스터 스레드)로만 구성된 스레드 팀
구조적 블록 내의 문에 대한 직렬 실행 순서(블록이 병렬 구문의 일부가 아닌 경우와 동일한 순서) 및
중첩된 병렬 구문의 효과 외에는 반환
omp_in_parallel()
된 값에 영향을 주지 않습니다.
shared
공유 변수는 단일 스토리지 블록의 이름을 지정합니다. 이 변수에 액세스하는 팀의 모든 스레드도 이 단일 스토리지 블록에 액세스합니다.
구조적 블록
구조화된 블록은 단일 항목과 단일 출구가 있는 문(단일 또는 복합)입니다. 문이 들어오거나 나가는 경우 해당 문은 구조화된 블록입니다. (이 규칙에는 다음에 대한 호출이 포함됩니다.
longjmp
호출이 허용되지만exit
(3C) 또는 사용throw
해당 실행이 항상 여{
는 위치에서 시작되고 항상 닫을}
때 끝나는 경우 복합 문은 구조화된 블록입니다. 식 문, 선택 문, 반복 문 또는try
블록은 해당 복합 문을 묶{
어 가져온 경우 구조화된 블록이며}
구조화된 블록이 됩니다. jump 문, 레이블이 지정된 문 또는 선언문은 구조화된 블록이 아닙니다.팀
구문 실행에 협력하는 하나 이상의 스레드입니다.
스레드
제어의 직렬 흐름, 프라이빗 변수 집합 및 공유 변수에 대한 액세스 권한이 있는 실행 엔터티입니다.
변수
필요에 따라 네임스페이스 이름으로 정규화된 식별자입니다. 이 식별자는 개체 이름을 지정합니다.
1.3 실행 모델
OpenMP는 병렬 실행의 포크 조인 모델을 사용합니다. 이 포크 조인 모델은 다양한 문제를 해결하는 데 유용할 수 있지만 대규모 배열 기반 애플리케이션에 맞게 조정됩니다. OpenMP는 병렬 프로그램(많은 실행 스레드 및 전체 OpenMP 지원 라이브러리)으로 올바르게 실행되는 프로그램을 지원하기 위한 것입니다. 또한 순차 프로그램(지시문이 무시되고 간단한 OpenMP 스텁 라이브러리)으로 올바르게 실행되는 프로그램용이기도 합니다. 그러나 순차적으로 실행할 때 제대로 작동하지 않는 프로그램을 개발할 수 있습니다. 또한 병렬 처리의 정도가 다르면 숫자 연산의 연결 변경으로 인해 다른 숫자 결과가 발생할 수 있습니다. 예를 들어 직렬 추가 감소는 병렬 감소와는 다른 추가 연결 패턴을 가질 수 있습니다. 이러한 서로 다른 연결은 부동 소수점 추가의 결과를 변경할 수 있습니다.
OpenMP C/C++ API로 작성된 프로그램은 마스터 스레드라는 단일 실행 스레드로 실행을 시작합니다. 마스터 스레드는 첫 번째 병렬 구문이 발견될 때까지 직렬 영역에서 실행됩니다. OpenMP C/C++ API에서 지시문은 parallel
병렬 구문을 구성합니다. 병렬 구문이 발견되면 마스터 스레드는 스레드 팀을 만들고 마스터는 팀의 마스터가 됩니다. 팀의 각 스레드는 작업 공유 구문을 제외하고 병렬 영역의 동적 익스텐트에서 문을 실행합니다. 팀의 모든 스레드는 동일한 순서로 작업 공유 구문을 발견해야 하며 하나 이상의 스레드는 연결된 구조화된 블록 내에서 문을 실행합니다. 절 없이 nowait
작업 공유 구문의 끝에 암시된 장벽은 팀의 모든 스레드에서 실행됩니다.
스레드가 공유 개체를 수정하는 경우 자체 실행 환경뿐만 아니라 프로그램의 다른 스레드에도 영향을 줍니다. 개체가 휘발성으로 선언된 경우에만 다른 스레드의 관점에서 다음 시퀀스 지점(기본 언어로 정의됨)에서 수정이 완료되도록 보장됩니다. 그렇지 않으면 수정 스레드가 처음 실행된 후에 수정이 완료되도록 보장됩니다. 그러면 다른 스레드(또는 동시에)에는 개체를 지정하는 지시문(암시적 또는 명시적)이 표시됩니다 flush
. flush
다른 OpenMP 지시문에 의해 암시된 지시문이 부작용의 올바른 순서를 보장하지 않는 경우 프로그래머가 추가적인 명시적 flush
지시문을 제공하는 것은 프로그래머의 책임입니다.
병렬 구문이 완료되면 팀의 스레드가 암시적 장벽에서 동기화되고 마스터 스레드만 계속 실행됩니다. 단일 프로그램에서는 임의의 수의 병렬 구문을 지정할 수 있습니다. 결과적으로 프로그램은 실행 중에 여러 번 포크하고 조인할 수 있습니다.
OpenMP C/C++ API를 사용하면 프로그래머가 병렬 구문 내에서 호출된 함수에서 지시문을 사용할 수 있습니다. 병렬 구문의 어휘 범위에 나타나지 않지만 동적 익스텐트 내에 있을 수 있는 지시문을 분리된 지시문이라고 합니다. 분리된 지시문을 사용하면 프로그래머가 프로그램의 주요 부분을 병렬로 실행할 수 있으며 순차 프로그램에 대한 최소한의 변경만 가능합니다. 이 기능을 사용하면 프로그램 호출 트리의 최상위 수준에서 병렬 구문을 코딩하고 지시문을 사용하여 호출된 함수에서 실행을 제어할 수 있습니다.
동일한 파일에 쓰는 C 및 C++ 출력 함수에 대한 동기화되지 않은 호출로 인해 다른 스레드로 작성된 데이터가 비결정적 순서로 표시되는 출력이 발생할 수 있습니다. 마찬가지로 동일한 파일에서 읽은 입력 함수에 대한 동기화되지 않은 호출은 비결정적 순서로 데이터를 읽을 수 있습니다. 각 스레드가 다른 파일에 액세스하는 I/O의 비동기화 사용은 I/O 함수의 직렬 실행과 동일한 결과를 생성합니다.
1.4 규격
OpenMP C/C++ API의 구현은 1장, 2, 3, 4 및 부록 C에 설명된 대로 이 사양의 모든 요소의 의미 체계를 인식하고 유지하는 경우 OpenMP 규 격입니다. 부록 A, B, D, E 및 F는 정보 용도로만 사용되며 사양의 일부가 아닙니다. API의 하위 집합만 포함하는 구현은 OpenMP 규격이 아닙니다.
OpenMP C 및 C++ API는 구현에서 지원하는 기본 언어에 대한 확장입니다. 기본 언어가 이 문서에 표시되는 언어 구문 또는 확장을 지원하지 않는 경우 OpenMP 구현을 지원할 필요가 없습니다.
모든 표준 C 및 C++ 라이브러리 함수 및 기본 제공 함수(즉, 컴파일러에 특정 지식이 있는 함수)는 스레드로부터 안전해야 합니다. 병렬 영역 내의 다른 스레드에서 스레드로부터 안전한 함수를 비동기화하여 사용하면 정의되지 않은 동작이 생성되지 않습니다. 그러나 이 동작은 직렬 지역과 동일하지 않을 수 있습니다. (난수 생성 함수가 예제입니다.)
OpenMP C/C++ API는 특정 동작이 구현 정의됨 을 지정합니다. 이러한 경우 해당 동작을 정의하고 문서화하려면 준수 OpenMP 구현이 필요합니다. 구현 정의 동작 목록은 부록 E를 참조하세요.
1.5 표준 참조
ISO/IEC 9899:1999, 정보 기술 - 프로그래밍 언어 - C. 이 OpenMP API 사양은 ISO/IEC 9899:1999를 C99로 참조합니다.
ISO/IEC 9899:1990, 정보 기술 - 프로그래밍 언어 - C. 이 OpenMP API 사양은 ISO/IEC 9899:1990을 C90으로 나타냅니다.
ISO/IEC 14882:1998, 정보 기술 - 프로그래밍 언어 - C++. 이 OpenMP API 사양은 ISO/IEC 14882:1998을 C++로 참조합니다.
이 OpenMP API 사양이 C를 참조하는 경우 구현에서 지원하는 기본 언어에 대한 참조가 수행됩니다.