{{위키데이터 속성 추적}}
{{소프트웨어 정보
|name = OpenMP
|logo = OpenMP logo.png
|author = OpenMP 아키텍처 리뷰 보드<ref>http://openmp.org/wp/about-openmp/ {{웨이백|url=http://openmp.org/wp/about-openmp/ |date=20130809153922 }} About the OpenMP ARB and OpenMP.org</ref>
|developer = OpenMP 아키텍처 리뷰 보드<ref>http://openmp.org/wp/about-openmp/ {{웨이백|url=http://openmp.org/wp/about-openmp/ |date=20130809153922 }} About the OpenMP ARB and OpenMP.org</ref>
| latest_release_version = 5.2
| latest_release_date = {{시작 날짜와 나이|2021|11}}
|programming_language = [[C (프로그래밍 언어)|C]], [[C++]], [[포트란]]
|operating_system = [[크로스 플랫폼]]
|platform = [[크로스 플랫폼]]
|genre = [[API]]
|license = 다양함<ref>http://openmp.org/wp/openmp-compilers/ OpenMP Compilers</ref>
| website = {{URL|openmp.org}}
}}
'''OpenMP'''(Open Multi-Processing, 오픈MP)는 [[공유 메모리]] [[멀티프로세서|다중 처리]] 프로그래밍 [[API]]로, [[C (프로그래밍 언어)|C]], [[C++]], [[포트란]] 언어와, [[유닉스 계열|유닉스]] 및 [[마이크로소프트 윈도우]] 플랫폼을 비롯한 여러 플랫폼을 지원한다.

[[병렬 프로그래밍]]의 하이브리드 모델로 작성된 응용 프로그램은 OpenMP와 [[메시지 전달 인터페이스]] (MPI)를 둘 다 사용하거나, 더 투명성 있는 방식으로 비공유 메모리 시스템을 위한 OpenMP 확장을 사용하여 [[컴퓨터 클러스터]] 상에서 구동할 수 있다.

== 역사 ==
OpenMP 아키텍처 리뷰 보드(ARB)는 최초의 API 규격인 포트란 1.0용 OpenMP를 1997년 10월에 출판하였다. C/C++용 OpenMP는 1998년 10월에 공개하였는데, 2000년 11월에 포트란 버전으로 2.0이 나온 다음 2002년 3월에 C/C++ 규격으로 2.0 버전이 출시되었다. 2005년 5월에 발표된 버전 2.5부터는 C/C++/포트란 규격이 통합되었다. 2008년 5월에 버전 3.0, 2013년 7월에 버전 4.0, 2015년 11월에 버전 4.5, 2018년 11월에 버전 5.0이 발표되었다.<ref>[https://www.openmp.org/specifications/ OpenMP 버전별 사양]</ref>

2019년 기준으로, 버전 2.5 이하를 레거시 사양으로 취급하고 있다.

== 주요 요소 ==
[[파일:OpenMP language extensions.svg|가운데|530px|섬네일|OpenMP의 구조.]]

== 예제 프로그램 ==
=== [[Hello World]] ===
==== [[C (프로그래밍 언어)|C]] ====
<syntaxhighlight lang=c>
 #include <omp.h>
 #include <stdio.h>
 #include <stdlib.h>

 int main (int argc, char *argv[]) {
   int th_id, nthreads;
   #pragma omp parallel private(th_id)
   {
     th_id = omp_get_thread_num();
     printf("Hello World : 스레드 %d\n", th_id);
     #pragma omp barrier
     if ( th_id == 0 ) {
       nthreads = omp_get_num_threads();
       printf("모두 %d 개의 스레드가 있습니다\n",nthreads);
     }
   }
   return EXIT_SUCCESS;
 }
</syntaxhighlight>

==== [[C++]] ====
<syntaxhighlight lang=c>
#include <omp.h>
#include <iostream>
#include <sstream>
int main (int argc, char *argv[]) {
 int th_id, nthreads;
#pragma omp parallel private(th_id)
 {
  th_id = omp_get_thread_num();
  std::ostringstream ss;
  ss << "Hello World : 스레드 " << th_id << std::endl;
  std::cout << ss.str();
#pragma omp barrier
#pragma omp master
  {
   nthreads = omp_get_num_threads();
   std::cout << "모두 " << nthreads << "개의 스레드가 있습니다" << std::endl;
  }
 }
 return 0;
}
</syntaxhighlight>

==== [[포트란 77]] ====
<syntaxhighlight lang=fortran>
      PROGRAM HELLO
      INTEGER ID, NTHRDS
      INTEGER OMP_GET_THREAD_NUM, OMP_GET_NUM_THREADS
C$OMP PARALLEL PRIVATE(ID)
      ID = OMP_GET_THREAD_NUM()
      PRINT *, 'HELLO WORLD : 스레드', ID
C$OMP BARRIER
      IF ( ID .EQ. 0 ) THEN
        NTHRDS = OMP_GET_NUM_THREADS()
        PRINT *, '모두', NTHRDS, '개의 스레드가 있습니다'
      END IF
C$OMP END PARALLEL
      END
</syntaxhighlight>

==== [[자유형 언어|자유형]] [[포트란 90]] ====
<syntaxhighlight lang=fortran>
 program hello90
 use omp_lib
 integer:: id, nthreads
   !$omp parallel private(id)
   id = omp_get_thread_num()
   write (*,*) 'Hello World : 스레드', id
   !$omp barrier
   if ( id == 0 ) then
     nthreads = omp_get_num_threads()
     write (*,*) '모두', nthreads, '개의 스레드가 있습니다'
   end if
   !$omp end parallel
 end program
</syntaxhighlight>

== 같이 보기 ==
{{위키공용분류}}
* [[병렬 컴퓨팅]]
* [[CUDA]]
* [[OpenCL]]

== 각주 ==
{{각주}}

== 외부 링크 ==
* {{언어링크|en}} {{공식 웹사이트|https://www.openmp.org/}}

{{병렬 컴퓨팅}}

[[분류:병렬 컴퓨팅]]
[[분류:API]]
[[분류:C 프로그래밍 언어 계열]]
[[분류:포트란]]