다음을 통해 공유


OpenMP에서 동시성 런타임으로 마이그레이션

동시성 런타임은 다양한 프로그래밍 모델을 사용합니다. 이러한 모델은 중복되거나 다른 라이브러리의 모델을 보완할 수 있습니다. 이 섹션의 문서에서는 OpenMP와 동시성 런타임을 비교하고 동시성 런타임을 사용하도록 기존 OpenMP 코드를 마이그레이션하는 방법에 대한 예제를 제공합니다.

OpenMP 프로그래밍 모델은 공개 표준에 의해 정의되며, Fortran 및 C/C++ 프로그래밍 언어에 대한 잘 정의된 바인딩을 가지고 있습니다. Microsoft C++ 컴파일러에서 지원하는 OpenMP 버전 2.0 및 2.5는 반복적인 병렬 알고리즘에 적합합니다. 즉, 데이터 배열에 대해 병렬 반복을 수행합니다. OpenMP 3.0은 반복 작업 외에도 비 반복 작업을 지원합니다.

OpenMP는 병렬 처리 수준이 미리 결정되어 있고 시스템에서 사용 가능한 리소스와 일치할 때 가장 효율적입니다. OpenMP 모델은 매우 큰 계산 문제가 한 컴퓨터의 처리 리소스에 분산되는 고성능 컴퓨팅에 특히 적합합니다. 이 시나리오에서 하드웨어 환경은 일반적으로 고정되며 개발자는 알고리즘이 실행될 때 모든 컴퓨팅 리소스에 단독으로 액세스할 수 있다고 합리적으로 예상할 수 있습니다.

그러나 제약이 적은 컴퓨팅 환경은 OpenMP에 적합하지 않을 수 있습니다. 예를 들어 재귀 문제(예: 빠른 정렬 알고리즘 또는 데이터 트리 검색)는 OpenMP 2.0 및 2.5를 사용하여 구현하기가 더 어렵습니다. 동시성 런타임은 비동기 에이전트 라이브러리PPL(병렬 패턴 라이브러리)을 제공하여 OpenMP의 기능을 보완합니다. 비동기 에이전트 라이브러리는 거친 세분화된 작업 병렬 처리를 지원합니다. PPL은 보다 세분화된 병렬 작업을 지원합니다. 동시성 런타임은 애플리케이션의 논리에 집중할 수 있도록 병렬로 작업을 수행하는 데 필요한 인프라를 제공합니다. 그러나 동시성 런타임은 다양한 프로그래밍 모델을 사용하도록 설정하므로 예약 오버헤드가 OpenMP와 같은 다른 동시성 라이브러리보다 클 수 있습니다. 따라서 동시성 런타임을 사용하도록 기존 OpenMP 코드를 변환할 때 성능을 증분 방식으로 테스트하는 것이 좋습니다.

OpenMP에서 동시성 런타임으로 마이그레이션하는 경우

다음과 같은 경우 동시성 런타임을 사용하도록 기존 OpenMP 코드를 마이그레이션하는 것이 유리할 수 있습니다.

케이스 동시성 런타임의 장점
확장 가능한 동시 프로그래밍 프레임워크가 필요합니다. 동시성 런타임의 기능 중 다수는 확장 가능합니다. 기존 기능을 결합하여 새 기능을 구성할 수도 있습니다. OpenMP는 컴파일러 지시문을 사용하므로 쉽게 확장할 수 없습니다.
애플리케이션은 협조적 차단의 이점을 누릴 수 있습니다. 아직 사용할 수 없는 리소스가 필요하기 때문에 태스크가 차단되면 동시성 런타임은 첫 번째 작업이 리소스를 기다리는 동안 다른 작업을 수행할 수 있습니다.
애플리케이션은 동적 부하 분산의 이점을 누릴 수 있습니다. 동시성 런타임은 워크로드가 변경될 때 컴퓨팅 리소스의 할당을 조정하는 예약 알고리즘을 사용합니다. OpenMP에서 스케줄러가 컴퓨팅 리소스를 병렬 지역에 할당하면 해당 리소스 할당은 계산 전체에서 수정됩니다.
예외 처리 지원이 필요합니다. PPL을 사용하면 병렬 지역 또는 루프의 내부 및 외부에서 예외를 catch할 수 있습니다. OpenMP에서는 병렬 지역 또는 루프 내에서 예외를 처리해야 합니다.
취소 메커니즘이 필요합니다. PPL을 사용하면 애플리케이션이 개별 작업과 병렬 작업 트리를 모두 취소할 수 있습니다. OpenMP를 사용하려면 애플리케이션이 자체 취소 메커니즘을 구현해야 합니다.
병렬 코드가 시작되는 다른 컨텍스트에서 완료해야 합니다. 동시성 런타임을 사용하면 한 컨텍스트에서 작업을 시작한 다음 다른 컨텍스트에서 해당 작업을 기다리거나 취소할 수 있습니다. OpenMP에서 모든 병렬 작업은 시작되는 컨텍스트에서 완료되어야 합니다.
향상된 디버깅 지원이 필요합니다. Visual Studio는 다중 스레드 애플리케이션을 보다 쉽게 디버그할 수 있도록 병렬 스택 및 병렬 작업 창을 제공합니다.

동시성 런타임에 대한 디버깅 지원에 대한 자세한 내용은 작업 창 사용, 병렬 스택 창 사용 및 연습: 병렬 애플리케이션 디버깅을 참조하세요.

OpenMP에서 동시성 런타임으로 마이그레이션하지 않을 경우

다음 사례에서는 동시성 런타임을 사용하도록 기존 OpenMP 코드를 마이그레이션하는 것이 적절하지 않을 수 있는 경우를 설명합니다.

케이스 설명
애플리케이션이 이미 요구 사항을 충족합니다. 애플리케이션 성능 및 현재 디버깅 지원에 만족하는 경우 마이그레이션이 적절하지 않을 수 있습니다.
병렬 루프 본문은 거의 작업을 수행하지 않습니다. 동시성 런타임 작업 스케줄러의 오버헤드는 특히 루프 본문이 상대적으로 작은 경우 루프 본문을 병렬로 실행하는 이점을 극복하지 못할 수 있습니다.
애플리케이션이 C로 작성되었습니다. 동시성 런타임은 많은 C++ 기능을 사용하므로 C 애플리케이션에서 완전히 사용할 수 있는 코드를 작성할 수 없는 경우에는 적합하지 않을 수 있습니다.

방법: 동시성 런타임을 사용하기 위해 OpenMP parallel for 루프 변환

OpenMP 병렬 지시문을 사용하는 기본 루프가 제공되면 동시성 런타임 동시성::p arallel_for 알고리즘을 사용하도록 변환하는 방법을 보여 줍니다.

방법: 동시성 런타임을 사용하기 위해 취소를 사용하는 OpenMP 루프 변환
모든 반복을 실행할 필요가 없는 루프에 대한 OpenMP 병렬을 사용하면 동시성 런타임 취소 메커니즘을 사용하도록 변환하는 방법을 보여 줍니다.

방법: 동시성 런타임을 사용하기 위해 예외 처리를 사용하는 OpenMP 루프 변환
예외 처리를 수행하는 루프에 대해 OpenMP 병렬이 지정된 경우 동시성 런타임 예외 처리 메커니즘을 사용하도록 변환하는 방법을 보여 줍니다.

방법: 동시성 런타임을 사용하기 위해 환산 변수를 사용하는 OpenMP 루프 변환
감소 절을 사용하는 루프에 대한 OpenMP 병렬이 제공되면 동시성 런타임을 사용하도록 변환하는 방법을 보여 줍니다.

참고 항목

동시성 런타임
OpenMP
PPL(병렬 패턴 라이브러리)
비동기 에이전트 라이브러리