2012-06-05 2 views
4

저는 계산 역학에 대한 연구를 위해 C++을 사용하여 몇 가지 코드를 개발 중입니다. 내 코드는 희소하고 밀도가 높은 행렬을 해결하고 메쉬를 생성하며 가장 간단한 의미로 유사한 연산을 수행합니다. 계산 시간을 줄이기 위해 코드를 병렬 처리해야하고 그 목적으로 OpenMP를 사용했습니다.병렬 처리 계획을 선택할 때 고려해야 할 사항은 무엇입니까?

그러나 ANSYS CFX와 같은 상업적으로 이용 가능한 코드를 자세히 살펴본 결과,이 소프트웨어에서 사용 된 병렬화 체계는 MPI의 구현 인 MPICH2라는 것을 알게되었습니다. 그래서

당신이 병렬화 도구를 많이 가지고/API의 :

  • OpenMP를
  • MPI
  • 인텔 스레딩 빌딩 블록
  • 에서는 Pthreads
  • 마이크로 소프트 PPL

내가 사용 이 도구 중 일부는 100 % CPU 사용량을 내 로컬 컴퓨터 각각을 사용합니다.

올바른 병렬 처리 도구를 선택할 때주의해야 할 기준을 모르겠습니다. 어떤 도구가 어떤 도구를 필요로합니까? 연구 목적으로 위의 사항 중 어느 것입니까? 그 중 어느 것이 상업용 소프트웨어에서 주로 사용됩니까?

+0

CUDA의 이상적인 사운드입니다. 보세요. 곧 그 CPU는 계속해서 유해한 것으로 간주됩니다. –

+0

동의합니다. CUDA가 가속기이기 때문에 나는 CUDA를 생각하고있었습니다. 하나는 CUDA와 위의 병렬 처리 중 하나를 사용할 수 있어야합니다. –

+0

가속기가 아니며, 병렬 계산을 위해 설계된 하드웨어 솔루션을 사용하기가 정말 빠르고 쉽습니다. PCIe를 통해 데이터를로드하면 숫자가 커지고 결과가 다시로드됩니다. CPU와 CUDA 기반 솔루션을 모두 필요로하지는 않습니다. 또한 OpenCL이 있습니다.이 제품은 벤더에 한정되지 않고 다른 ASICS 용으로 구현됩니다 (저는 Altera가 FPGA 기반 OpenCL 구현을 시도하거나 그렇게 할 계획이었습니다) –

답변

7

이 유형의 많은 질문에 대해서는 확실한 최종 답이 없습니다. 답은 언제나 "의존적"이기 때문에 더 나은 것을 실제로 말할 수는 없습니다. 코드 작성 방법, 이식성 요구 사항 등.

  • OpenMP : 목록에 따라

    꽤 표준 내가 정말 사용하기 쉬운 입니다 발견했다. 원본 코드가 병렬화를 염두에두고 작성되지 않았더라도이 라이브러리는 단계별 접근법을 매우 쉽게 만듭니다. 나는 엔트리 포인트을 병렬 컴퓨팅으로 생각하기 때문에 일 수있다. 모든 것을 쉽지만 디버깅하기가 어렵고 성능이 제한되어 있고 코드가 병렬로되어있다. (병렬 알고리즘, 구조체, 프리미티브가 없기 때문에 불가능하다. 네트워크를 통해 작업 범위 확장).

  • Message Passing Interface :이 표준에 기반한 라이브러리는 내 관점에서 볼 때 클러스터 전체에서 큰 계산을 수행하는 데 가장 적합합니다. 컴퓨터가 거의없고 계산을 병렬로 수행하려는 경우 잘 알려진 안정적인 선택입니다. 내 생각에 다시 로컬 병렬화에 대한 해결책이 아닙니다. 그리드 컴퓨팅을 위해 널리 사용되는 잘 알려진 표준을 찾고 있다면 MPI가 당신을위한 것입니다.
  • Intel Threading Building Blocks : 다른 환경 (pthread 또는 Windows의 스레딩 모델)에서 멀티 스레딩을 위해 인터페이스를 통합하는 C++ 라이브러리입니다. 이런 라이브러리를 사용한다면 아마도 컴파일러와 환경에 이식 할 수 있어야합니다. 또한이 라이브러리를 사용하면 제한이 없으므로 다른 것과 잘 통합 될 수 있습니다 (예 : MPI). 도서관에 가셔서 과 같은지 확인하십시오. 좋은 디자인으로 잘 선택되어 있으며 잘 설명되어 있고 널리 사용되고 있습니다.
  • Microsoft Parallel Patterns Library : 매우 큰 라이브러리입니다.그것은 아주 새롭기 때문에 나는 누군가에게 좋은 테스트없이 그것을 사용할 것을 제안하는 것이 안전하다고 느끼지 않으며, 게다가 마이크로 소프트는 당신이 그것의 컴파일러에 묶여 있음을 확신합니다. 그것이 내가 본 것을 위해 그것은 훌륭한 도서관이라고 말했다. 그것은 많은 세부 사항을 추상화합니다. 잘 설계되어 있으며 "병렬 작업"개념에 대한 매우 높은 수준의 시각을 제공합니다. 다시이 라이브러리를 사용하면 클러스터 용 MPI (예 : Concurrency Runtime에는이 라이브러리가 있습니다)와 같이 사용할 수 없습니다.

무엇을 사용합니까? 나는 대답이 없습니다. 그냥 편안함을 느껴보십시오 (Boost Threads도보십시오). 어떻게 든 OpenMP + MPI, MPI + TBB 또는 MPI + PLL과 같이 혼합 할 수 있습니다. PPL에 대한 선호가 있지만 실제 응용 프로그램을 개발할 경우 더 나은 결과를 결정하기 위해 긴 테스트가 필요할 수 있습니다. 병렬 처리와 많은 "수직"패키지 (Agents, PPL, TPL)를위한 기본 프레임 워크 (구조와 알고리즘 포함)를 제공하기 때문에 사실 "Concurrency Runtime"(PPL 기반)이 "수평"이므로 좋아합니다.

계산을 병렬로 만들었을 때 CPU 집중적 인 루틴의 성능을 향상시켜야 할 수도 있습니다. 으로 GPU를 사용하는 것이 좋습니다. short 대용량 병렬 계산을 위해 최선을 다할 것입니다. 물론 CUDA 성능이 may be higher 인 경우에도 CUDA 이상의 OpenCL을 선호합니다. 사실이 주제에 관심이 있으시면 OpenHMPP을 살펴 보시기 바랍니다.

+0

PPL에 동의합니다. 또한 사용하기가 매우 쉽습니다. 유일한 문제는 클러스터링이 Windows에서 매우 비쌉니다. 하지만 로컬 병렬 처리의 경우에는 정말 좋게 보입니다. –

+0

@EmreTurkoz 맞습니다. Windows에서 클러스터링을하면 하드웨어보다 소프트웨어에 더 많은 돈을 투자 할 수 있습니다. 그렇다고해서 저렴한 Linux 기반 위성 컴퓨터에서 MPI를 사용하는 등 라이브러리를 혼합하지 않아도됩니다 (필요한 경우). "주"컴퓨터의 PPL + MPI. –

+0

참고로, 대부분의 PPL은 MS에만 국한되는 TBB로 제공됩니다. – Rick

3

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는 가파른 학습 곡선을 가지고 있지만, 단일 컴퓨팅 노드가 제공 할 수있는 것보다 프로그램이 더 길다면 나중에 언제든지 다시 시작할 수 있습니다.

관련 문제