2014-04-23 1 views
6

멀티 스레딩을 구현하는 데는 여러 가지 방법이 있습니다. std::thread은 결국 C++ 11 표준으로 가져 왔지만 boost::thread을 효과적으로 대신 사용할 수있었습니다. 각 기술에는 특정 구문과 내용이 있지만 대략적으로 CPU 병렬 프로그래밍에 사용됩니다. 하지만 그들은 다른 효과가 있습니다. 예를 들어, MPI와 OpenMP가 다른 메모리 모델에 사용된다는 것을 알고 있습니다.OpenMP, MPI, POSIX 스레드, std :: thread, boost :: thread는 어떻게 상호 연관되어 있습니까?

기술의 선택이 실제로 배타적이지 않으므로 또 다른 기술 (다시, MPI 및 OpenMP)을 사용할 수 있다는 것도 알고 있습니다. 어떻게 다른 효과에 사용되지만 동일한 소스 (CPU)로 계속 작업합니까?

각 기술에 기반한 병렬 처리로 C++ 프로그램을 컴파일하면 (운영 체제 및 하드웨어 관점에서 볼 때) 차이점은 무엇입니까? 예를 들어 OpenMP 또는 std::thread이 POSIX 스레드를 사용합니까? 그렇다면 C++ 11의 스레드는 Windows에서 어떻게 작동합니까? 아니면 이러한 각각의 기술은 어셈블리 언어 등을 통해 CPU와 직접 작동합니까?

+2

OpenMP와 다른 스레드 패러다임을 함께 사용합니다. 'std :: thread'는 지정된 동작이 아닙니다. 명세에서 명시 적으로 금지되어 있지는 않다. 하지만 여전히 작동 여부는 구현에 따라 다릅니다. MPI와 OpenMP 또는 다른 스레딩 패러다임을 결합하는 것은 MPI가 쓰레드에 대한 지원으로 적절히 초기화되어있는 한 괜찮습니다. –

답변

9

OS는 스레드 (새로운 스레드를 작성하는 syscalls, 스케줄링 서비스)를 제공합니다.

유닉스 libc에는 많은 유용한 기능 (mutexes, cond vars 등)이있는 OS 스레드 주위에 래퍼가 있습니다. 이러한 시스템 라이브러리의 보통 외부 인터페이스는 "POSIX 스레드"(pthread_*라는 기능)입니다 : http://en.wikipedia.org/wiki/POSIX_Threads

Windows가 자신의 하드 사용하기 스레딩 API (WINAPI의 CreateThread 등)이있다. 그러나 POSIX는 API를 스레드 같은 것을 얻기 위해 윈도우 API 래퍼가있다 (예를 들면 mingw32와 Cygwin에서에 대한 같은 라이브러리가있다; wikipedia section 확인)

C++ 11 std::thread는, 부스트의 boost::thread 시스템 스레딩 주변 단지 현대 OS에 독립적 인 래퍼 API. 이들은 #ifdef 지옥을 만들지 않고 그리고/또는 시스템 스레딩 라이브러리 주위에 자신의 커스텀 래퍼를 작성하지 않고, 지원되는 플랫폼에서 컴파일 할 수있는 이식 가능한 프로그램을 만드는 데 사용됩니다. 새 프로그램을 만드는 경우이 방법을 사용해보십시오.

다른 여러 가지 스레딩 래퍼가 있습니다. QT 또는 GTK +와 같은 그래픽 라이브러리에 포함되어 있습니다.

OpenMP 구현에는 시스템/libc 스레딩 API를 사용하는 내부 지원 라이브러리가 있습니다 (예 : gcc는 libgomp를 가짐). 예를 들어 libgomp는 POSIX 스레드를 사용합니다. 일부 구현에는 어셈블리를 통한 사용자 공간 스레드 전환 (M : N 스레딩 모델)이 포함될 수도 있습니다.

MPI에는 스레드 라이브러리가 없습니다. MPI는 여러 프로세스를 작성하고 이들 사이의 통신을 설정하는 데 사용됩니다. 그러나 MPI가 다중 스레드 프로그램에서 사용될 때, 동기화를 수행하기 위해 일부 스레딩 API를 사용할 것입니다. 예를 들어, MPICH는 유닉스에서 pthread를 사용할 것입니다.