OpenMP

OpenMP
OpenMP
OpenMP logo
원저작자OpenMP 아키텍처 리뷰[1] 위원회
개발자OpenMP 아키텍처 리뷰[1] 위원회
안정된 릴리스
5.1 / 2020년 11월 13일, 20개월 전(2020-11-13)
운영 체제크로스 플랫폼
플랫폼크로스 플랫폼
유형C, C++Fortran으로의 확장, API
면허증.다양[2].
웹 사이트openmp.org

OpenMP(Open Multi-Processing)는 Solaris, AIX, FreeBSD, HP-UX, Linux, Windows포함한 많은 플랫폼, 명령 집합 아키텍처운영 체제에서 C, C+Fortran[3]멀티 플랫폼 공유 메모리 멀티프로세싱 프로그래밍을 지원하는 API(Application Programming Interface)입니다.런타임 [2][4][5]동작에 영향을 주는 컴파일러 명령어, 라이브러리 루틴 및 환경 변수 집합으로 구성됩니다.

OpenMP는 비영리 기술 컨소시엄 OpenMP Architecture Review Board(또는 OpenMP ARB)에 의해 관리되며 Arm, AMD, IBM, Intel, Cray, HP, Fujitsu, NVIDIA, Red Hat, Texas Instruments, Oracle [1]등 주요 컴퓨터 하드웨어 및 소프트웨어 벤더에 의해 공동으로 정의됩니다.

OpenMP는 프로그래머에게 표준 데스크톱 컴퓨터에서 슈퍼 컴퓨터에 이르는 플랫폼용 병렬 애플리케이션을 개발하기 위한 간단하고 유연한 인터페이스를 제공하는 휴대용 확장형 모델을 사용합니다.

병렬 프로그래밍의 하이브리드 모델을 사용하여 구축된 애플리케이션은 OpenMP와 MPI(Message Passing Interface)를 모두 사용하여 컴퓨터 클러스터에서 실행할 수 있으며, OpenMP는 (멀티코어) 노드 내에서 병렬 처리에 사용되며, MPI는 노드 간의 병렬 처리에 사용됩니다.또한 소프트웨어 분산 공유 메모리 시스템에서 [6]OpenMP를 실행하고 OpenMP를 MPI로[7][8] 변환하며 비공유 메모리 [9]시스템을 위해 OpenMP를 확장하려는 노력도 있어 왔습니다.

설계.

주 스레드가 코드 블록을 병렬로 실행하는 여러 스레드를 분리하는 멀티스레딩의 그림입니다.

OpenMP는 멀티스레딩의 구현으로 프라이머리 스레드(연속적으로 실행되는 일련의 명령)가 지정된 수의 서브스레드를 포크하고 시스템이 태스크를 이들 사이에 분할하는 병렬화 방법입니다.그런 다음 스레드가 동시에 실행되며 런타임 환경은 스레드를 서로 다른 프로세서에 할당합니다.

병렬로 실행되도록 의도된 코드의 섹션은 섹션이 [3]실행되기 전에 스레드가 형성되도록 하는 컴파일러 지시와 함께 표시됩니다.각 스레드에는 ID가 첨부되어 있으며, 이 ID는 함수를 사용하여 얻을 수 있습니다(이러한 이름).omp_get_thread_num()스레드 ID는 정수이고 프라이머리 스레드의 ID는 0입니다.병렬화된 코드를 실행한 후 스레드는 프라이머리 스레드에 다시 결합되어 프로그램의 마지막까지 계속됩니다.

기본적으로는 각 스레드는 코드의 병렬화된 섹션을 독립적으로 실행합니다.작업 공유 구성을 사용하여 스레드 간에 태스크를 분할하여 각 스레드가 할당된 코드 부분을 실행할 수 있습니다.이와 같이 OpenMP를 사용하여 작업 병렬화데이터 병렬화모두 수행할 수 있습니다.

런타임 환경은 사용량, 시스템 부하 및 기타 요인에 따라 프로세서에 스레드를 할당합니다.런타임 환경은 환경 변수에 따라 스레드 수를 할당하거나 코드를 함수를 사용하여 할당할 수 있습니다.OpenMP 함수는 라벨이 붙은 헤더 파일에 포함되어 있습니다.C/C++의 omp.h 를 참조해 주세요.

역사

OpenMP Architecture Review Board(ARB)는 1997년 10월에 최초의 API 사양인 OpenMP for Fortran 1.0을 발표했습니다.이듬해 10월에 C/C++ 표준을 출시했습니다.2000년에는 Fortran 사양 버전 2.0과 C/C++ 사양 버전 2.0이 2002년에 출시되었습니다.버전 2.5는 2005년에 출시된 C/C++/Fortran의 복합 사양입니다.

버전 2.0까지 OpenMP는 주로 고도로 규칙적인 루프를 병렬화하는 방법을 지정했습니다.이는 루프의 반복 횟수를 엔트리 시 알 수 있는 매트릭스 지향 수치 프로그래밍에서 발생하기 때문입니다.이는 제한사항으로 인식되었으며 다양한 작업 병렬 확장이 구현에 추가되었습니다.2005년에는 태스크 병렬화를 표준화하려는 노력이 형성되어 2007년에 제안서를 발표하였으며, Cilk, X10 [10]Chapel의 태스크 병렬화 기능에서 영감을 얻었다.

버전 3.0은 2008년5월에 출시되었습니다.3.0의 신기능에는 태스크의 개념[11]태스크구축이 포함되어 있어 OpenMP [12]2.0의 대부분을 구성하고 있는 병렬루프 구조보다 OpenMP의 범위를 크게 넓히고 있습니다.

사양 [13]버전 4.0은 2013년 7월에 출시되었습니다.액셀러레이터 지원, atomics, 오류 처리, 스레드 어피니티, 태스크 확장, 사용자 정의 감소, SIMD 지원, Fortran 2003 [14][full citation needed]지원 등의 기능을 추가 또는 개선합니다.

현재 버전은 5.1이며 2020년 11월에 출시되었습니다.

모든 컴파일러(및 OS)가 최신 버전의 모든 기능을 지원하는 것은 아닙니다.

핵심 요소

OpenMP 구성 차트

OpenMP의 핵심 요소는 스레드 작성, 워크로드 분산(워크 쉐어링), 데이터 환경 관리, 스레드 동기화, 사용자 수준의 런타임 루틴 및 환경 변수 구성입니다.

C/C++에서는 OpenMP는 #pragmas를 사용합니다.OpenMP 고유의 플러그마는 다음과 같습니다.

스레드 작성

플러그마 omp parallel은 구조에 포함된 작업을 병렬로 수행하기 위해 추가 스레드를 분기하는 데 사용됩니다.원래 스레드는 스레드 ID가 0인 마스터 스레드로 표시됩니다.

예(C 프로그램):여러 스레드를 사용하여 "Hello, world"를 표시합니다.

#실패하다 <stdio.h> #실패하다 <omp.h>  인트 주된(무효) {     #440mp 병렬     인쇄물(안녕, 세상아.\n");     돌아가다 0; } 

GCC를 사용하여 컴파일하려면 flag -fopenmp를 사용합니다.

$ gcc - fopenmp hello . c - o hello -ldl

2개의 코어가 있는 컴퓨터에서의 출력, 즉 2개의 스레드:

안녕, 세상아.안녕 세계. 

그러나 표준 출력을 공유하는 2개의 스레드에서 발생하는 레이스 상태 때문에 출력도 왜곡될 수 있습니다.

안녕하세요, wold.rld. 

여부printfC++와 달리 원자성은[15] 기본 구현에 의존합니다.std::cout.

워크셰어링 구성

하나 또는 모든 스레드에 독립 작업을 할당하는 방법을 지정하는 데 사용됩니다.

  • omp for 또는 omp do: 루프 반복을 스레드 간에 분할하기 위해 사용됩니다.루프 구성이라고도 합니다.
  • 섹션: 서로 다른 스레드에 연속적이지만 독립된 코드 블록 할당
  • single: 1개의 스레드만으로 실행되는 코드 블록을 지정하면 최종적으로 장벽이 암시됩니다.
  • master: 싱글과 비슷하지만 코드 블록은 마스터 스레드에 의해서만 실행되며 최종적으로 장벽은 없습니다.

예: 각 스레드를 사용하여 작업의 일부를 수행하는 대규모 어레이의 값을 병렬로 초기화합니다.

인트 주된(인트 argc,  **argv) {     인트 a[100000];      #420ma omp 병렬:     위해서 (인트 i = 0; i < > 100000; i++) {         a[i] = 2 * i;     }      돌아가다 0; } 

이 예는 당황스러울 정도로 평행하며 i의 값에만 의존합니다.OpenMP parallel for 플래그는 OpenMP 시스템에 이 작업을 작업 스레드 간에 분할하도록 지시합니다.스레드는 각각 [16]변수의 고유한 개인 버전을 수신합니다.예를 들어 워커 스레드가 2개 있는 경우 한 스레드는 0에서 49999로 실행되는i 버전을 전달받고 두 번째 스레드는 50000에서 9999로 실행되는 버전을 전달할 수 있습니다.

배리언트 디렉티브

바리안트 디렉티브는 프로그래머가 퍼포먼스의 휴대성을 향상시키기 위해 OpenMP 5.0 사양에 도입된 주요 기능 중 하나입니다.컴파일 시 OpenMP 플러그마 및 사용자 코드를 적용할 수 있습니다.이 사양은 구현에 의해 제공되는 활성 OpenMP 구조, 실행 장치 및 기능, 특성 및 사용자 정의 조건에 기초한 컨텍스트 셀렉터 및 메타지향사용자가 동일한 코드영역을 다른 디렉티브로 프로그래밍하도록 지시하는 특성을 정의합니다.

  • metadirective는 OpenMP 조건 또는 컨텍스트를 정의하는 특성에 따라 여러 디렉티브 배리언트에서 선택하여 컴파일 시 조건부로 다른 디렉티브로 해결되는 실행 가능한 디렉티브입니다.
  • declaire variant 디렉티브메타디렉티브와 같은 기능을 가지지만 컨텍스트 또는 사용자 정의 조건에 따라 콜사이트에서 기능 배리언트를 선택합니다.

변종 선택을 위한 두 가지 변종 디렉티브에 의해 제공되는 메커니즘은 C/C++ 전처리보다 사용하기 편리합니다.이는 OpenMP 컴파일러가 변종과 컨텍스트에서 변종 선택을 직접 지원하며 최종 디렉티브를 분석하고 결정할 수 있기 때문입니다.

// 전처리 지시를 사용한 코드 적응  인트 v1[N], v2[N], v3[N]; #정의되어있는경우(premptx)  #to:v1,v2) 맵(from:v3)에 대해 #to:vmp 타깃 팀이 병렬로 배포합니다.   위해서 (인트 i= 0; i< > N; i++)       v3[i] = v1[i] * v2[i];   #실패하다  #map(to:v1,v2) 맵(from:v3)의 경우 #mp target parallel (to:v1,v2)   위해서 (인트 i= 0; i< > N; i++)       v3[i] = v1[i] * v2[i];   #엔디프   // OpenMP 5.0에서 메타디렉티브를 사용한 코드 적응  인트 v1[N], v2[N], v3[N]; #subma omp 타깃맵(to:v1,v2) 맵(from:v3)   #subma omp 메타디렉티브 \ when(device={arch(parallel(parallel)x): 대상 팀이 병렬로 배포하는 경우\ default(타깃 병렬)   위해서 (인트 i= 0; i< > N; i++)       v3[i] = v1[i] * v2[i]; 

조항

OpenMP는 공유 메모리 프로그래밍 모델이기 때문에 OpenMP 코드의 대부분의 변수는 기본적으로 모든 스레드에 표시됩니다.그러나 때로는 개인 변수가 레이스 조건을 회피하기 위해 필요하고 시퀀셜 부분과 병렬 영역(병렬로 실행되는 코드 블록) 사이에 값을 전달할 필요가 있기 때문에 데이터 환경 관리는 OpenMP 디렉티브에 추가함으로써 데이터 공유 속성 구로서 도입됩니다.구에는 다음과 같은 종류가 있습니다.

데이터 공유 속성 절
  • 공유: 병렬 영역 외부에서 선언된 데이터가 공유됩니다. 즉, 모든 스레드가 동시에 표시 및 액세스할 수 있습니다.기본적으로는 작업 공유 영역의 모든 변수는 루프 반복 카운터를 제외하고 공유됩니다.
  • private: 병렬 영역 내에서 선언된 데이터는 각 스레드에 대해 비공개입니다., 각 스레드에 로컬 복사가 있어 임시 변수로 사용됩니다.개인 변수는 초기화되지 않으며 병렬 영역 외부에서 사용하기 위해 값이 유지되지 않습니다.기본적으로는 OpenMP 루프구조의 루프 반복 카운터는 프라이빗입니다.
  • default: 프로그래머는 병렬 영역 내의 기본 데이터 스코핑이 공유 또는 없음(C/C++), 공유, 퍼스트프라이빗, 프라이빗 또는 없음(Fortran) 중 하나임을 나타낼 수 있습니다.none 옵션은 프로그래머가 데이터 공유 속성 구를 사용하여 병렬 영역의 각 변수를 선언하도록 합니다.
  • first private: 원래 값으로 초기화된 경우를 제외하고 private와 같습니다.
  • lastprivate: 원래 값이 구성 후 업데이트된다는 점을 제외하고 private와 같습니다.
  • reduction: 시공 후 모든 스레드에서 작업을 안전하게 결합할 수 있는 방법.
동기절
  • critical: 동봉된 코드 블록은 한 번에 하나의 스레드에 의해서만 실행되며 여러 스레드에 의해 동시에 실행되지 않습니다.레이스 조건으로부터 공유 데이터를 보호하기 위해 자주 사용됩니다.
  • atomic: 다음 명령의 메모리 업데이트(쓰기 또는 읽기-수정-쓰기)는 atomic적으로 실행됩니다.스테이트먼트 전체가 atomic이 되는 것은 아닙니다.메모리 업데이트만이 atomic이 됩니다.컴파일러는 critical을 사용하는 경우보다 퍼포먼스를 향상시키기 위해 특별한 하드웨어 명령을 사용할 수 있습니다.
  • 순서: 구조화된 블록은 순차적인 루프에서 반복이 실행되는 순서대로 실행됩니다.
  • 장벽: 각 스레드는 팀의 다른 스레드가 모두 이 지점에 도달할 때까지 기다립니다.워크셰어링 컨스트럭트는 마지막에 암묵적인 장벽 동기화를 가진다.
  • nowait: 할당된 작업을 완료하는 스레드가 팀의 모든 스레드가 완료될 때까지 기다리지 않고 계속할 수 있도록 지정합니다.이 절이 없는 경우 스레드는 워크셰어링 구성의 마지막에 장벽 동기화에 조우합니다.
스케줄링 조항
  • 스케줄(타입, 청크):이것은 작업 공유 구조가 do-loop 또는 for-loop인 경우에 유용합니다.작업 공유 구성에서의 반복은 이 절에서 정의된 스케줄링 방법에 따라 스레드에 할당됩니다.스케줄링에는 다음 3가지 유형이 있습니다.
  1. static: 여기서는 모든 스레드가 루프 반복을 실행하기 전에 반복 할당됩니다.반복은 기본적으로 스레드 간에 균등하게 분할됩니다., 파라미터 청크에 정수를 지정하면 연속된 반복 청크 수가 특정 스레드에 할당됩니다.
  2. 동적:여기서 일부 반복은 더 적은 수의 스레드에 할당됩니다.특정 스레드가 할당된 반복을 마치면 나머지 반복에서 다른 스레드를 가져오기 위해 돌아갑니다.매개 변수 청크는 한 번에 스레드에 할당되는 연속된 반복 횟수를 정의합니다.
  3. guided: 연속된 반복의 큰 청크가 각 스레드에 동적으로 할당됩니다(위와 같음).연속적으로 할당될 때마다 청크 크기가 매개 변수 청크에 지정된 최소 크기로 기하급수적으로 감소합니다.
IF 제어
  • if: 이렇게 하면 조건이 충족되는 경우에만 스레드가 작업을 병렬화할 수 있습니다.그렇지 않으면 코드 블록이 연속적으로 실행됩니다.
초기화
  • first private: 데이터는 각 스레드에 대해 비공개이지만 마스터 스레드에서 동일한 이름을 사용하여 변수 값을 사용하여 초기화됩니다.
  • lastprivate: 데이터는 각 스레드에 대해 비공개입니다.현재 반복이 병렬화 루프의 마지막 반복일 경우 이 개인 데이터의 값은 병렬 영역 외부에 동일한 이름을 사용하여 글로벌 변수에 복사됩니다.변수는 firstprivate와 lastprivate 모두 사용할 수 있습니다.
  • 스레드프라이빗:데이터는 글로벌 데이터이지만 런타임 동안 각 병렬 영역에서 비공개입니다.threadprivate와 private의 차이는 threadprivate와 관련된 글로벌스코프 및 병렬영역에 걸친 preserved 값입니다.
데이터 복사
  • copyin: 프라이빗 변수firstprivate와 마찬가지로 스레드프라이빗 변수는 copyin을 사용하여 대응하는 글로벌 변수에서 을 전달하지 않는 한 초기화되지 않습니다.스레드프라이빗 변수의 값은 전체 프로그램을 실행하는 동안 유지되므로 복사가 필요하지 않습니다.
  • copyprivate: single과 함께 사용하여 한 스레드(단일 스레드)의 프라이빗 오브젝트에서 팀 내 다른 스레드 상의 대응하는 오브젝트로 데이터 값을 복사할 수 있습니다.
축소
  • reduction ( list ) : 변수는 각 스레드에 로컬복사가 있지만 로컬복사 값은 글로벌 공유변수로 요약(개요)이것은 변수에 대한 특정 연산자(이 특정 절에 대해 연산자로 지정)가 반복적으로 실행되어 특정 반복의 값이 이전 반복의 값에 따라 달라지는 경우에 매우 유용합니다.동작 증분으로 이어지는 단계는 병렬화되지만 스레드는 스레드 세이프 방식으로 글로벌 변수를 업데이트합니다.이것은 일반적인 예로서 함수와 미분방정식수치적분을 병렬화하는 데 필요하다.
다른이들
  • flush: 이 변수의 값이 레지스터에서 메모리로 복원되어 병렬 부품 외부에서 이 값을 사용합니다.
  • master: 마스터 스레드(OpenMP 디렉티브 실행 중 다른 모든 스레드)에 의해서만 실행됩니다.암묵적인 장벽은 없습니다.다른 팀원(스레드)은 도달할 필요가 없습니다.

사용자 수준의 런타임 루틴

스레드 수 변경/체크, 실행 컨텍스트가 병렬 영역에 있는지 여부, 현재 시스템의 프로세서 수, 잠금 설정/설정 해제, 타이밍 기능 등에 사용됩니다.

환경 변수

OpenMP 응용 프로그램의 실행 기능을 변경하는 메서드입니다.루프 반복 스케줄링, 기본 스레드 수 등을 제어하는 데 사용됩니다.예를 들어 OMP_NUM_THREADS는 응용 프로그램의 스레드 수를 지정하는 데 사용됩니다.

실장

OpenMP는 많은 상용 컴파일러에 구현되어 있습니다.예를 들어 Visual C++ 2005, 2008, 2010, 2012 및 2013은 다양한 [20]프로세서에 대응하는 Intel Parallel Studio와 더불어 OpenMP 2.0, Professional, Team System, Premium 및 Ultimate[17][18][19] 에디션도 지원합니다.Oracle Solaris Studio 컴파일러 및 도구는 Solaris OS(UltraSPARC 및 x86/x64) 및 Linux 플랫폼용 생산성 향상과 함께 최신 OpenMP 사양을 지원합니다.Portland Group의 Fortran, C 및 C++ 컴파일러도 OpenMP 2.5를 지원하고 있습니다.GCC도 버전 4.2 이후 OpenMP를 지원하고 있습니다.

OpenMP 3.0을 구현한 컴파일러:

  • GCC 4.3.1
  • 메르쿠륨 컴파일러
  • 인텔 Fortran 및 C/C++ 버전11.0 및 11.1 컴파일러, 인텔 C/C++ 및 Fortran Composer XE 2011 및 Intel Parallel Studio.
  • IBM XL[21] 컴파일러
  • Sun Studio 12 업데이트 1에는 OpenMP 3.0이[22] 완전히 구현되어 있습니다.
  • 멀티프로세서 컴퓨팅

OpenMP 3.1을 지원하는 컴파일러는 다음과 같습니다.

  • GCC 4.7[23]
  • 인텔 Fortran 및 C/C++ 컴파일러 12[24].1
  • AIX 및 Linux용 IBM XL C/C++ 컴파일러, V13.1 및[25][26] AIX 및 Linux용 IBM XL Fortran 컴파일러, V14.1
  • LLVM/Clang 3.7[27]
  • Absoft Fortran 컴파일러 버전 19 Windows, Mac OS X 및 Linux용[28]

OpenMP 4.0을 지원하는 컴파일러:

  • C/C++의 경우 GCC 4.9.0, Fortran의[23][29] 경우 GCC 4.9.1
  • 인텔 Fortran 및 C/C++ 컴파일러 15[30].0
  • Linux용 IBM XL C/C++, V13.1(부분),[25] Linux용 XL Fortran, V15.1(부분)[26]
  • LLVM/Clang 3.7 (일부)[27]

OpenMP 4.5를 지원하는 여러 컴파일러:

  • C/C++용 GCC 6
  • 인텔 Fortran 및 C/C++ 컴파일러 17.0, 18.0, 19.0
  • LLVM/Clang 12 [33]

OpenMP 5.0 부분 지원:

  • C/C++용 GCC 9
  • 인텔 Fortran 및 C/C++ 컴파일러 19.1
  • LLVM/Clang 12 [33]

OpenMP 명령어로 주석을 단 소스 코드를 생성하는 자동 병렬 컴파일러:

OpenMP를 지원하는 프로파일러 및 디버거는 다음과 같습니다.

  • 인텔 VTune Profiler - x86 CPU e X GPU 아키텍처용 프로파일러
  • 인텔 어드바이저 - OpenMP 및 MPI 코드 설계 지원 및 분석 도구
  • Alinea DDT ( Distributed Debugging Tool )– OpenMP 및 MPI 코드용 디버거
  • Alinea MAP – OpenMP 및 MPI 코드용 프로파일러
  • TotalView - OpenMP, MPI 및 시리얼 코드용 Rogue Wave 소프트웨어의 디버거
  • ompP – Open용 프로파일러MP
  • VAMPIR – OpenMP 및 MPI 코드용 프로파일러

장점과 단점

장점:

  • 휴대용 멀티스레딩 코드(C/C++ 및 기타 언어에서는 일반적으로 멀티스레딩을 얻으려면 플랫폼 고유의 프리미티브를 호출해야 합니다).
  • 단순: MPI처럼 메시지 전달을 처리할 필요가 없습니다.
  • 데이터 레이아웃 및 분해는 지시에 따라 자동으로 처리됩니다.
  • 공유 메모리 시스템의 [36]MPI에 필적하는 확장성.
  • 증분 병렬: 프로그램의 한 부분에서 동시에 작업할 수 있으므로 코드를 크게 변경할 필요가 없습니다.
  • 직렬 및 병렬 애플리케이션용 통합 코드:시퀀셜 컴파일러가 사용되는 경우 OpenMP 구조는 코멘트로 취급됩니다.
  • 원래(시리얼) 코드문은 일반적으로 OpenMP와 병렬화된 경우 수정할 필요가 없습니다.이것에 의해, 부주의로 버그가 발생할 가능성이 줄어듭니다.
  • 세밀한 병행과 세밀한 병행이 모두 가능하다.
  • 밀접하게 결합된 유체 입자 시스템에서 볼 수 있는 것처럼 SPMD 계산 모드만을 준수하지 않는 불규칙한 다중 물리 애플리케이션에서는 OpenMP의 유연성이 [36][37]MPI보다 큰 성능 이점을 가질 수 있습니다.
  • GPGPU[38]FPGA 등 다양한 액셀러레이터에서 사용할 수 있습니다.

단점:

  • 동기 버그 및 레이스 [39][40]조건을 디버깅하기 어려운 리스크가 있습니다.
  • 2017년 현재 공유 메모리 멀티프로세서 플랫폼에서만 효율적으로 실행됩니다(단, Wayback Machine 및 기타 분산 공유 메모리 플랫폼에서 인텔 클러스터 OpenMP 아카이브 2018-11-16 참조).
  • OpenMP를 지원하는 컴파일러가 필요합니다.
  • 확장성은 메모리 아키텍처에 의해 제한됩니다.
  • 비교[41]스왑은 지원되지 않습니다.
  • 신뢰할 수 있는 오류 처리가 없습니다.
  • 스레드-프로세서 매핑을 제어하는 세밀한 메커니즘이 없습니다.
  • 실수로 잘못된 공유 코드를 쓸 가능성이 높습니다.

퍼포먼스에 대한 기대

N 프로세서 플랫폼에서 OpenMP를 사용하여 병렬화된 프로그램을 실행하면 N배 속도가 향상될 수 있습니다.단, 이는 다음과 같은 이유로 거의 발생하지 않습니다.

  • 종속성이 존재하는 경우 프로세스는 종속 데이터가 계산될 때까지 기다려야 합니다.
  • 여러 프로세스가 병렬 증명되지 않은 리소스(기입할 파일 등)를 공유하는 경우 해당 요청은 순차적으로 실행됩니다.따라서 각 스레드는 다른 스레드가 리소스를 해제할 때까지 기다려야 합니다.
  • 프로그램의 많은 부분이 OpenMP에 의해 병렬화되지 않을 수 있습니다. 즉, Amdahl의 법칙에 따라 속도 상승의 이론 상한이 제한됩니다.
  • Symmetric Multiprocessing(SMP; 대칭형 멀티프로세서)의 N개의 프로세서는 N배의 계산 능력을 가질 수 있지만 메모리 대역폭은 보통 N배의 스케일 업이 되지 않습니다.대부분의 경우 원래 메모리 경로는 여러 프로세서에 의해 공유되며 공유 메모리 대역폭을 놓고 경쟁할 때 성능 저하가 발생할 수 있습니다.
  • 병렬 컴퓨팅의 최종 속도 향상에 영향을 미치는 다른 많은 일반적인 문제(로드 밸런싱 및 동기화 오버헤드 등)도 OpenMP에 적용됩니다.
  • OpenMP를 호출할 때 컴파일러 최적화가 효과적이지 않을 수 있습니다.이로 인해 일반적으로 단일 스레드 OpenMP 프로그램은 OpenMP 플래그 없이 컴파일된 코드(완전 시리얼)보다 느리게 실행될 수 있습니다.

스레드 어피니티

일부 벤더는 OpenMP 스레드에 프로세서 [42][43][44]어피니티를 설정하여 특정 프로세서코어와 관련짓는 것을 권장합니다.이를 통해 코어 간의 스레드 마이그레이션 및 컨텍스트 전환 비용을 최소화할 수 있습니다.또한 데이터 인접성을 향상시키고 코어(또는 프로세서) 간의 캐시 일관성 트래픽을 줄입니다.

벤치마크

OpenMP의 사용법을 시연하고 성능을 테스트하며 정확성을 평가하기 위해 다양한 벤치마크가 개발되었습니다.

간단한 예

  • OmpsCR: OpenMP 소스 코드 저장소

퍼포먼스 벤치마크에는 다음이 포함됩니다.

  • NAS 병렬 벤치마크
  • 바르셀로나 OpenMP 태스크 스위트는 OpenMP 태스크 구현을 테스트할 수 있는 응용 프로그램 모음입니다.
  • SPEC 시리즈
    • SPEC OMP 2012
    • SPEC ACEL 벤치마크 스위트 테스트 OpenMP 4 타깃 오프로드 API
    • SPEChpc 2002 벤치마크
  • CORAL 벤치마크
  • Exascale 프록시 응용 프로그램
  • 가속기에 집중하는 로디니아.
  • 문제 기반 벤치마크 스위트

정확성 벤치마크에는 다음이 포함됩니다.

  • OpenMP 검증 스위트
  • OpenMP 검증 및 검증 테스트 슈트
  • Data Race Bench는 OpenMP 데이터 레이스 검출 툴의 효과를 체계적이고 정량적으로 평가하도록 설계된 벤치마크 스위트입니다.
  • AutoParBench는 OpenMP 디렉티브를 자동으로 삽입할 수 있는 컴파일러와 툴을 평가하는 벤치마크 스위트입니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ a b c "About the OpenMP ARB and". OpenMP.org. 2013-07-11. Archived from the original on 2013-08-09. Retrieved 2013-08-14.
  2. ^ a b "OpenMP Compilers & Tools". OpenMP.org. November 2019. Retrieved 2020-03-05.
  3. ^ a b Gagne, Abraham Silberschatz, Peter Baer Galvin, Greg (2012-12-17). Operating system concepts (9th ed.). Hoboken, N.J.: Wiley. pp. 181–182. ISBN 978-1-118-06333-0.
  4. ^ Supercomputing 2008에서의 OpenMP 튜토리얼
  5. ^ OpenMP 사용– 휴대용 공유 메모리 병렬 프로그래밍– 책 예제를 다운로드하여 토론
  6. ^ Costa, J.J.; et al. (May 2006). "Running OpenMP applications efficiently on an everything-shared SDSM". Journal of Parallel and Distributed Computing. 66 (5): 647–658. doi:10.1016/j.jpdc.2005.06.018.
  7. ^ Basumallik, 에이온;민, Seung-Jai, Eigenmann, 루돌프(2007년).분산 메모리 Sytems[원문대로]은 2007년 국제 병렬과 분산 처리 공동 학술 대회 OpenMP. 논문집을 사용하여 프로그래밍.뉴욕:IEEE프레스.를 대신하여 서명함. 1–8.CiteSeerX 10.1.1.421.8570. doi:10.1109/IPDPS.2007.370397.아이 에스비엔 978-1-4244-0909-9.S2CID 14237507.A미리 인쇄하다 첸은 정의 홈 페이지에;OpenMP의 번역에 평균 탄착 중심점에 특히 섹션 3사용할 수 있습니다.
  8. ^ Wang, Jue; Hu, ChangJun; Zhang, JiLin; Li, JianJiang (May 2010). "OpenMP compiler for distributed memory architectures". Science China Information Sciences. 53 (5): 932–944. doi:10.1007/s11432-010-0074-0. (2016년 현재 이 문서에서 설명하는 KLCoMP 소프트웨어는 공개되지 않은 것으로 보입니다.)
  9. ^ Cluster OpenMP (인텔 C++ 컴파일러 버전 9.1에서 11.1로 제공되던 제품이지만 13.0에서 폐기되었습니다)
  10. ^ Ayguade, Eduard; Copty, Nawal; Duran, Alejandro; Hoeflinger, Jay; Lin, Yuan; Massaioli, Federico; Su, Ernesto; Unnikrishnan, Priya; Zhang, Guansong (2007). A proposal for task parallelism in OpenMP (PDF). Proc. Int'l Workshop on OpenMP.
  11. ^ "OpenMP Application Program Interface, Version 3.0" (PDF). openmp.org. May 2008. Retrieved 2014-02-06.
  12. ^ LaGrone, James; Aribuki, Ayodunni; Addison, Cody; Chapman, Barbara (2011). A Runtime Implementation of OpenMP Tasks. Proc. Int'l Workshop on OpenMP. pp. 165–178. CiteSeerX 10.1.1.221.2775. doi:10.1007/978-3-642-21487-5_13.
  13. ^ "OpenMP 4.0 API Released". OpenMP.org. 2013-07-26. Archived from the original on 2013-11-09. Retrieved 2013-08-14.
  14. ^ "OpenMP Application Program Interface, Version 4.0" (PDF). openmp.org. July 2013. Retrieved 2014-02-06.
  15. ^ "C - How to use printf() in multiple threads".
  16. ^ "Tutorial – Parallel for Loops with OpenMP". 2009-07-14.
  17. ^ Visual C++ 에디션, Visual Studio 2005
  18. ^ Visual C++ 에디션, Visual Studio 2008
  19. ^ Visual C++ 에디션, Visual Studio 2010
  20. ^ David Worthington, "Intel은 병행 스튜디오를 통해 개발 라이프 사이클대처합니다" 2009년 5월 26일 SDTimes Wayback Machine에서 2012-02-15년 아카이브 완료 (2009년 5월 28일 액세스 완료)
  21. ^ "XL C/C++ for Linux 기능", (2009년 6월 9일 액세스)
  22. ^ "Oracle Technology Network for Java Developers Oracle Technology Network Oracle". Developers.sun.com. Retrieved 2013-08-14.
  23. ^ a b "openmp – GCC Wiki". Gcc.gnu.org. 2013-07-30. Retrieved 2013-08-14.
  24. ^ Submitted by Patrick Kennedy... on Fri, 09/02/2011 – 11:28 (2011-09-06). "Intel® C++ and Fortran Compilers now support the OpenMP* 3.1 Specification Intel® Developer Zone". Software.intel.com. Retrieved 2013-08-14. {{cite web}}: author=범용명(도움말)이 있습니다.
  25. ^ a b "IBM XL C/C++ compilers features". 13 December 2018.
  26. ^ a b "IBM XL Fortran compilers features". 13 December 2018.
  27. ^ a b "Clang 3.7 Release Notes". llvm.org. Retrieved 2015-10-10.
  28. ^ "Absoft Home Page". Retrieved 2019-02-12.
  29. ^ "GCC 4.9 Release Series – Changes". www.gnu.org.
  30. ^ "OpenMP* 4.0 Features in Intel Compiler 15.0". Software.intel.com. 2014-08-13. Archived from the original on 2018-11-16. Retrieved 2014-11-10.
  31. ^ "GCC 6 Release Series - Changes". www.gnu.org.
  32. ^ "OpenMP Compilers & Tools". openmp.org. www.openmp.org. Retrieved 29 October 2019.
  33. ^ a b "OpenMP Support — Clang 12 documentation". clang.llvm.org. Retrieved 2020-10-23.
  34. ^ "GOMP — An OpenMP implementation for GCC - GNU Project - Free Software Foundation (FSF)". gcc.gnu.org. Archived from the original on 2021-02-27. Retrieved 2020-10-23.
  35. ^ "OpenMP* Support". Intel. Retrieved 2020-10-23.
  36. ^ a b Amritkar, Amit; Tafti, Danesh; Liu, Rui; Kufrin, Rick; Chapman, Barbara (2012). "OpenMP parallelism for fluid and fluid-particulate systems". Parallel Computing. 38 (9): 501. doi:10.1016/j.parco.2012.05.005.
  37. ^ Amritkar, Amit; Deb, Surya; Tafti, Danesh (2014). "Efficient parallel CFD-DEM simulations using OpenMP". Journal of Computational Physics. 256: 501. Bibcode:2014JCoPh.256..501A. doi:10.1016/j.jcp.2013.09.007.
  38. ^ GPU용 OpenMP 액셀러레이터 지원
  39. ^ C++에서의 OpenMP 레이스 조건 검출 및 회피
  40. ^ "Alexey Kolosov, Evgeniy Ryzhkov, Andrey Karpov 32 OpenMP traps for C++ developers". Archived from the original on 2017-07-07. Retrieved 2009-04-15.
  41. ^ Stephen Blair-Chappell, Intel Corporation, 9분 만에 병렬 프로그래밍 전문가가 됨ACCU 2010 컨퍼런스 프레젠테이션
  42. ^ Chen, Yurong (2007-11-15). "Multi-Core Software". Intel Technology Journal. 11 (4). doi:10.1535/itj.1104.08.
  43. ^ "OMPM2001 Result". SPEC. 2008-01-28.
  44. ^ "OMPM2001 Result". SPEC. 2003-04-01. Archived from the original on 2021-02-25. Retrieved 2008-03-28.

추가 정보

외부 링크