2009-08-19 6 views
24

OpenMP를 사용하는 C++ 프로그램이 있는데 OpenMP가 설치되어 있거나 설치되어 있지 않은 여러 컴퓨터에서 실행됩니다.이없는 컴퓨터에서 OpenMP를 무시합니다.

기계에 OpenMP가없고, #include <omp.h>, OpenMP 지정 문 (#pragma omp parallel ... 등) 및/또는 라이브러리 기능 (예 : tid = omp_get_thread_num();)을 무시하면 프로그램에서 어떻게 알 수 있습니까?

+1

앤드류의 대답을 참조하십시오. 내가 말할 수있는 가장 좋은 것은 그가 실제로 질문에 답한 유일한 사람이다. 또한 어떤 전처리기를 정의합니까 -fopenmp 제공합니까? (http://stackoverflow.com/q/30803126) – jww

답변

1

OpenMP는 컴파일러 런타임이며 플랫폼과 관련이 없습니다.

즉. Visual Studio 2005 이상을 사용하여 응용 프로그램을 컴파일하면 런타임에서 지원하는 OpenMP를 항상 사용할 수 있습니다. (그리고 최종 사용자가 Visual Studio C 런타임을 설치하지 않은 경우 앱이 전혀 작동하지 않습니다).

그렇다면 걱정할 필요가 없습니다. 사용 가능하다면 strcmp와 같은 기능이 항상있을 것입니다. CRT가 있는지 확인하려면 재배포 가능 Visual Studio를 설치할 수 있습니다.

편집 :

확인하지만, GCC 4.1이 문제는 대상 컴퓨터되지 않도록, 당신의 OpenMP 응용 프로그램을 컴파일 할 수 없습니다 만, 대상 컴파일러. 모든 컴파일러는 미리 정의 된 매크로를 사용하여 버전을 제공하므로 #ifdef 블록으로 OpenMP 호출을 래핑하십시오. 예를 들어, GCC는 3 개의 매크로를 사용하여 컴파일러 버전을 식별합니다. __GNUC__, __GNUC_MINOR__ and __GNUC_PATCHLEVEL__

+0

내 문제는 그것을 가지고 있지 않은 컴퓨터에서 멀티 스레딩없이 프로그램을 실행하고 싶다는 것입니다. 버전 4.2.x 아래의 GCC는 OpenMP를 지원하지 않습니다. 그래서 Makefile에서 이것을 말할 수있게하고 g ++이 컴파일에 실패하는 대신 내 프로그램에서 OpenMP 부분을 무시하도록 요청하고 싶습니다. 어떤 생각? – Tim

+3

-1 : 컴파일러 버전이 완전히 적합하지 않습니다. 컴파일러와 런타임 모두 openmp를 지원해야하고 _ 또한 _enabled_해야합니다. 동일한 컴파일러 버전은 한 컴퓨터에서 openmp를 지원하고 다른 컴퓨터에서는 지원하지 않을 수 있습니다. –

19

컴파일러는 이해할 수없는 명령어 #pragma을 무시합니다. 이것이 구문의 핵심입니다. 그리고 openmp.h에 정의 된 함수는 비 - 병렬 시스템에서 간단하게 잘 정의 된 의미를 가지고 있습니다. 특히, 헤더 파일은 컴파일러가 ENABLE_OPENMP을 정의하는지 확인하고, 활성화되어 있지 않으면 올바른 대체물을 제공합니다.

그래서, 당신에게 필요한 건 openmp.h의 사본입니다. 여기에 하나 : http://cms.mcc.uiuc.edu/qmcdev/docs/html/OpenMP_8h-source.html.

#if defined(ENABLE_OPENMP) 
#include <omp.h> 
#else 
typedef int omp_int_t; 
inline omp_int_t omp_get_thread_num() { return 0;} 
inline omp_int_t omp_get_max_threads() { return 1;} 
#endif 

은 최악의 경우, 당신은 단지 그 세 줄을 타고 더미 openmp.h 파일에 넣어, 그를 사용할 수 있습니다

코드의 관련 부분은,하지만, 바로 이것이다. 나머지는 그냥 작동합니다.

+11

'#pragma' 의미론 +1. 'ENABLE_OPENMP'에서는 -1이 표준에 적합하지 않습니다. 대신에'_OPENMP'를 사용하십시오. – YvesgereY

+0

* "... 헤더 파일은 컴파일러가 ENABLE_OPENMP를 정의하는지 여부를 확인합니다"* - 나는 이것이 사실이라고 생각하지 않습니다.'ENABLE_OPENMP'에 대한 참조를 제공해 주시겠습니까? 내가 전처리가 정의에서 찾을 수 없습니다. [전처리 기가 -fopenmp에서 제공하는 정의는 무엇입니까?] (http://stackoverflow.com/q/30803126) – jww

+0

clang 3.6.2로 컴파일 중이며'clang ++ -fopenmp'는 _OPENMP가 정의되지 않았 음을 알려줍니다. – Arne

48

OpenMP를 컴파일 처리기 정의 "_OPENMP"를 추가, 그래서 당신은 할 수 있습니다 :

#if defined(_OPENMP) 
    #pragma omp ... 
#endif 
몇 가지 예를 들어

참조 http://bisqwit.iki.fi/story/howto/openmp/#Discussion 다음과 코드를.

+5

#pragma omp를 보호 할 필요가 없습니다. 왜냐하면 그러한 pragma는 방해가되지 않기 때문입니다 (openmd가 활성화되지 않은 경우 안전하게 건너 뜁니다). – YvesgereY

+9

사실, 경고없이 컴파일을 원한다면 "경고 : 알 수없는 pragma 무시"와 같은 컴파일러 메시지가 성가 시게됩니다. –

+2

컴파일 경고에 대해, 나는이 이유 때문에'-Wno-unknown-pragmas'를 사용하여 컴파일하는 것을 사용합니다. 문제점 : 프로젝트의 다른 pragma에 영향을 줄 수 있으며 유용한 경고를 제거 할 수 있습니다. –

관련 문제