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 병렬이 제공되면 동시성 런타임을 사용하도록 변환하는 방법을 보여 줍니다.