Adriano의 대답에 대한 확장 된 주석 (및 확장)을 고려하십시오.
OpenMP는 마스터 및 사용법이 매우 간단하며 직렬 및 병렬 실행 파일을 하나의 동일한 소스 코드에서 생성 할 수있는 좋은 기능이 있습니다. 또한 기존 직렬 코드를 병렬 코드로 변환해야하는 경우 점진적 병렬화 경로를 사용할 수 있습니다. OpenMP에는 단점이 있습니다. 첫째, 대규모 x86 SMP 시스템이 현재 사용 가능하지만 확장 성을 크게 제한하는 공유 메모리 시스템만을 대상으로합니다 (예 : 클러스터 설치시 최대 2 TiB 공유 RAM을 공유하는 128 개의 CPU 코어가있는 QPI 결합 Xeon 시스템이 있습니다. 대형 OpenMP 작업). 둘째, 프로그래밍 모델이 너무 단순하여 일부 고급 개념을 구현할 수 없습니다. 그러나 이것이 OpenMP를 간결하게 유지하기 때문에 이것이 모델의 단점 이라기보다 강점이라고 말할 수 있습니다.
MPI는 현재 사실상 표준 메시지 전달 API입니다. 이 아키텍처는 광범위하게 지원되며 광범위한 병렬 아키텍처에서 실행됩니다. 분산 메모리 모델은 낮은 대기 시간과 높은 대역폭의 네트워크 상호 연결을 제외하고는 기본 하드웨어에 대한 제한을 거의 또는 전혀 부과하지 않으며 수십만 개의 CPU 코어로 확장 할 수 있습니다. 알고리즘 자체가 이식성 (예 : Blue Gene/P에서 매우 효율적으로 실행되고 InfiniBand 클러스터에서 매우 느리게 실행될 수 있음)과 같은 휴대용 확장 성이 없더라도 MPI 프로그램은 소스 레벨에서 이식성이 뛰어납니다. MPI에는 하나의 심각한 단점이 있습니다. SPMD (단일 프로그램 다중 데이터) 모델은 프로그래머를 대신하여 많은 정신 분열증 적 사고를 필요로하며 OpenMP보다 마스터하기가 훨씬 어렵습니다. 직렬 알고리즘을 MPI로 이식하는 것은 OpenMP를 사용하는 것만 큼 쉽지는 않으며 병렬 효율성을 높이기 위해 전체 다시 쓰기가 필요할 수 있습니다. 또한 점진적 병렬 접근 방식을 취하고 직렬 및 병렬 실행 파일을 생성 할 수있는 코드베이스를 쉽게 유지 관리 할 수는 없습니다. MPI는 흥미로운 특징을 가지고있다. 별도의 노드에서 실행되는 프로그램의 다른 부분을 완전히 분리하고 네트워크에 추상 인터페이스를 제공하기 때문에 이기종 컴퓨팅이 가능하다. 여러 MPI 구현 (예 : Open MPI)은 서로 다른 OS 하에서 실행되는 노드뿐만 아니라 다른 "비트"및 엔디안을 가진 CPU를 혼합 할 수있는 이기종 지원을 제공합니다.
인텔 TBB는 스테로이드의 OpenMP와 유사합니다. CUDA 나 OpenCL과 같은 다른 병렬 프로그래밍 패러다임에 더 가깝게 자리 잡은 커널을 기반으로 훨씬 더 풍부한 프로그래밍 모델을 제공합니다. 적용 성 및 확장 성 측면에서 C + + STL 알고리즘을 많이 사용합니다. 컴파일러 중립적이기도하고 원칙적으로 인텔 C++ 컴파일러, GNU g ++ 및 MSVC에서 작동해야합니다. ITBB는 사전주의를 취하지 않으면 이전 패러다임이 발생하기 쉬운 잠재적 인 계산 상충을 잠재적으로 제거 할 수있는 "도둑질"이데올로기를 사용합니다.
Pthreads는 최신 유닉스 계열 (예 : FreeBSD, Mac OS X, Linux 등)의 휴대용 스레딩 인터페이스입니다. 이것은 스레딩 라이브러리이며 상상할 수있는 가장 일반적인 사용 사례를 대상으로합니다. 병렬 구조가 거의 없거나 전혀 없으며, 맨 위에 명시 적으로 프로그래밍해야합니다. 간단한 루프 반복 배포 라하더라도 OpenMP는 직접 코딩해야합니다. Pthreads는 Unix가 Win32 쓰레드가 Windows에 정확히 무엇인지 알려주는 것입니다.
그 개념을 혼합
명확하게 하나의 노드가 점진적으로 더 많은 코어를 점점로서 미래의 방법이다 (난 정말 그 라이브러리를 알 수 없기 때문에 나는 마이크로 소프트 TPP를 건너 뛸 것입니다). 대부분의 알고리즘에서는 여러 수준의 병렬 처리가 가능하며 MPI를 사용하여 여러 클러스터 노드에서 실행되는 대단위 병렬 처리를 수행 할 수 있으며 OpenMP 또는 ITBB를 사용하여 개별 노드 계산의 세분화 된 분할을 수행 할 수 있습니다. 공유 메모리 프로그래밍은 일반적으로 스레드간에 공유되기 때문에 메모리 자원을 더 잘 활용할 수 있으며 캐시 재사용과 같은 것들은 계산을 상당히 빠르게 할 수 있습니다. MPI는 또한 멀티 코어 SMP 또는 NUMA 머신을 프로그래밍하는 데 사용할 수 있지만 각 MPI 프로세스는 고유 한 가상 주소 공간을 가진 별도의 OS 프로세스이므로 많은 구성 데이터를 복제해야 할 수도 있습니다. MPI 사람들은 스레드가 MPI 프로세스를 실행할 수 있도록 표준을 개선하기 위해 노력하고 있으며 "MPI 끝점"은 향후 출시 될 MPI 표준 버전 3.0으로 끝날 수 있습니다.
프로그래밍 배경과 가장 가까운 것을 선택하는 것이 좋습니다. 열렬한 C++ 프로그래머이고 추상화를 호흡하는 경우 Intel TBB (또는 .Net에 들어 있다면 Microsoft PPL)를 선택하십시오. OpenMP는 쉽게 마스터 할 수 있으며 좋은 성능을 제공하지만 다소 단순합니다. Fortran에서 다중 스레드 코드를 작성하는 데 여전히 널리 사용 가능하고 사용되는 메커니즘입니다. MPI는 가파른 학습 곡선을 가지고 있지만, 단일 컴퓨팅 노드가 제공 할 수있는 것보다 프로그램이 더 길다면 나중에 언제든지 다시 시작할 수 있습니다.
CUDA의 이상적인 사운드입니다. 보세요. 곧 그 CPU는 계속해서 유해한 것으로 간주됩니다. –
동의합니다. CUDA가 가속기이기 때문에 나는 CUDA를 생각하고있었습니다. 하나는 CUDA와 위의 병렬 처리 중 하나를 사용할 수 있어야합니다. –
가속기가 아니며, 병렬 계산을 위해 설계된 하드웨어 솔루션을 사용하기가 정말 빠르고 쉽습니다. PCIe를 통해 데이터를로드하면 숫자가 커지고 결과가 다시로드됩니다. CPU와 CUDA 기반 솔루션을 모두 필요로하지는 않습니다. 또한 OpenCL이 있습니다.이 제품은 벤더에 한정되지 않고 다른 ASICS 용으로 구현됩니다 (저는 Altera가 FPGA 기반 OpenCL 구현을 시도하거나 그렇게 할 계획이었습니다) –