2012-06-16 4 views
4

내 linux에 gcc와 mpich 라이브러리를 설치 한 후 mpicxx 컴파일러로 코드를 컴파일 할 수 있습니다. gcc 컴파일러를 업그레이드 할 때 mpi 라이브러리와 함께 C++ 11을 사용할 수 있습니까?C++ 11과 MPI 라이브러리의 호환성

+0

아마도 당신은 이미 C++ 11로 구동되는 gcc 버전을 가지고있을 것입니다.'-std = C++ 11' 플래그를 확인하십시오. –

+0

내 컴퓨터에 설치된 gcc 버전이 C++ 11을 지원하지 않습니다. – peaceman

+1

그렇다면 무엇을 시도 했습니까? :) MPI와 C++ 11 기능은 거의 직각을 이루고 있기 때문에 제 작품의 효과는 좋을 것이라고 생각합니다. –

답변

5

컴파일러를 최신 버전으로 변경하면 강력한 코드 생성 변경 사항 (예 : 다른 데이터 정렬 또는 다른 ABI)이 관찰되지 않으면 일반적으로 작동합니다. MPI는 라이브러리이므로 내부 구조가 엉망이 아닌 한 사용하는 언어 구조는 마음에 들지 않습니다. C++ 11에서 제공하는 스레딩에 대해 C++ 11을 사용할 예정이므로주의해야 할 몇 가지 사항이 있습니다.

첫째, 멀티 스레딩이 항상 MPI와 잘 맞지는 않습니다. 대부분의 MPI 구현은 내부적으로 자체적으로 스레드되지만 이 아니라 기본적으로 스레드 안전합니다.

  • MPI_THREAD_SINGLE :

    둘째, MPI 스레딩 지원 네 가지 수준의 정의 스레딩 지원 - MPI 안전하게 단일 스레드 응용 프로그램에서 사용하는 경우 작동 것이다;

  • MPI_THREAD_FUNNELED : 부분 스레드 지원 - MPI는 다중 스레드 응용 프로그램에서 사용할 수 있지만 주 스레드 만 MPI를 호출 할 수 있습니다.
  • MPI_THREAD_SERIALIZED : 부분 스레딩 지원 - MPI는 다중 스레드 응용 프로그램에서 사용할 수 있지만 다른 스레드의 동시 호출은 허용되지 않습니다. 즉, 각 스레드는 MPI로 호출 할 수 있지만 직렬화 메커니즘이 있어야합니다.
  • MPI_THREAD_MULTIPLE : 풀 스레딩 지원 - MPI는 많은 스레드에서 자유롭게 호출 할 수 있습니다.

진실은 대부분의 MPI 구현은 그들의 대부분은 MPI_THERAD_SINGLE을 지원하여 최대의 상자 MPI_THREAD_FUNNELED에서 지원합니다. 예를 들어 Open MPI는 전체 스레딩 지원을 얻으려면 기본값이 아닌 옵션으로 컴파일해야합니다.

멀티 스레드 응용 프로그램을 대신 MPI_Init()MPI_Init_thread()를 사용하여 MPI 라이브러리 및 초기화 호출이 될 수 있습니다 스레드를 초기화해야 메인 스레드 - 레벨 만 지원하는 경우 MPI를 호출 할 수있는 바로 그 메인 쓰레드MPI_THREAD_FUNNELED입니다. 하나는 MPI_Thread_init()에 원하는 스레딩 지원 레벨을 제공하고이 함수는 이 지원되는 레벨을 지원합니다.이 값은 원하는 것보다 낮을 수 있습니다. 후자의 경우 정확하고 이식 가능한 프로그램이 그에 따라 동작해야하고 스레드되지 않은 작업으로 전환하거나 해당 오류 메시지와 함께 사용자에게 중단됩니다.

MPI가 스레드와 함께 작동하는 방법에 대한 자세한 내용은 MPI Standard v2.2에서 확인할 수 있습니다.

5

내가 생각할 수있는 한 아무런 문제가 없습니다. 어떤 식 으로든 MPI 지시어를 조작해서는 안되며, MPI 및 C++ 11 문제는 직각입니다. 내 컴퓨터 (GCC 4.6.3, MPICH2 1.4.1)에 mpic++ 또는 mpicxx을 발행하는 방식으로

, 단순히 당신은 mpic++ -show하여 자신의 컴퓨터에서 그것을 확인할 수 있습니다

c++ -Wl,-Bsymbolic-functions -Wl,-z,relro -I/usr/include/mpich2 -L/usr/lib -lmpichcxx -lmpich -lopa -lmpl -lrt -lcr -lpthread

로 변환합니다.

2

C++ 11과 MPI를 결합해도 문제가 없습니다.

mpiC++ 및 mpicxx는 표준 컴파일러 또는 사용자 지정 컴파일러 중 하나만 사용하는 래퍼입니다. 따라서 mpiC++ 및 mpicxx는 C++ 11과 호환되는 컴파일러를 사용하도록 정의 할 수 있습니다.

나는 mpich에 대한 정확한 명령을 모른다. opemmpi 위해 당신은 이러한 환경 플래그를 설정해야합니다 : 내 경우

export OMPI_CC='gcc-mp-4.7' 
export OMPI_CXX='g++-mp-4.7' 

나는 MacPorts를에서 GCC 4.7 컴파일러와 함께하는 openmpi 1.5.5을 사용합니다.