programing

OpenMP가 없는 시스템에서 OpenMP 무시

i4 2023. 7. 25. 20:28
반응형

OpenMP가 없는 시스템에서 OpenMP 무시

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

컴퓨터에 OpenMP가 없는지 프로그램에 알려주고 무시하려면 어떻게 해야 합니까?#include <omp.h>오픈 MP 디렉티브(예:#pragma omp parallel ...) 및/또는 라이브러리 기능(예:tid = omp_get_thread_num();) ?

OpenMP 컴파일은 전처리기 정의 "_OPENMP"를 추가하므로 다음 작업을 수행할 수 있습니다.

#if defined(_OPENMP)
   #pragma omp ...
#endif

몇 가지 예는 http://bisqwit.iki.fi/story/howto/openmp/ #Discusion과 그 뒤에 나오는 코드를 참조하십시오.

컴파일러는 무시해야 합니다.#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파일, 그리고 그것을 사용합니다.나머지는 효과가 있을 겁니다.

OpenMP는 컴파일러 런타임의 것이지 플랫폼의 것이 아닙니다.

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

그래서 걱정할 필요가 없습니다. 만약 당신이 그것을 사용할 수 있다면, 그것은 항상 strcmp와 같은 기능들처럼 있을 것입니다.CRT가 있는지 확인하기 위해 Visual Studio 재배포 가능한 파일을 설치할 수 있습니다.

편집:

좋아요, 하지만 GCC 4.1은 당신의 오픈 MP 앱을 컴파일할 수 없을 것입니다. 그래서 문제는 대상 시스템이 아니라 대상 컴파일러입니다.모든 컴파일러에는 버전을 제공하는 미리 정의된 매크로가 있으므로 OpenMP 호출을 #ifdef 블록으로 마무리합니다.예를 들어, GCC는 컴파일러 버전을 식별하기 위해 3개의 매크로를 사용합니다.__GNUC__, __GNUC_MINOR__ and __GNUC_PATCHLEVEL__

컴퓨터에 OpenMP가 없는지 프로그램에 알려주고 무시하려면 어떻게 해야 합니까?#include <omp.h>오픈 MP 디렉티브(예:#pragma omp parallel ...) 및/또는 라이브러리 기능(예:tid = omp_get_thread_num();) ?

답이 늦었지만, 우리는 방금 사용으로 인해 버그 보고서를 받았습니다.#pragma omp simd마이크로소프트 컴파일러에서.

OpenMP 사양에 따라 섹션 2.2:

조건부 컴파일

프리프로세서를 지원하는 구현에서 _OPENMP 매크로 이름은 10진수 값 yyymm로 정의됩니다. 여기서 yyyy와 mm는 구현이 지원하는 OpenMP API 버전의 연도 및 월 지정입니다.

최신 마이크로소프트 컴파일러는 2000년에서 2005년 사이에 OpenMP만 지원하는 것으로 보입니다.2000년에 OpenMP 2.0이 출시되었고, 2005년에 OpenMP 2.5가 출시되었기 때문에 "some between"이라고만 말할 수 있습니다.하지만 마이크로소프트는 2002년 버전을 광고합니다.

여기 몇 가지가 있습니다._OPENMP숫자...

  • Visual Studio 2012 - OpenMP 200203
  • Visual Studio 2017 - OpenMP 200203
  • IBM XLC 13.01 - OpenMP 201107
  • Clang 7.0 - OpenMP 201107
  • GCC 4.8 - OpenMP 201107
  • GCC 8.2 - OpenMP 201511

그래서 만약 당신이 사용하고 싶다면, 말해주세요.#pragma omp simd루프를 보호하기 위해, 그리고.#pragma omp simdOpenMP 4.0에서 사용할 수 있으며, 다음과 같습니다.

#if _OPENMP >= 201307
    #pragma omp simd
    for (size_t i = 0; i < 16; ++i)
        data[i] += x[i];
#else
    for (size_t i = 0; i < 16; ++i)
        data[i] += x[i];
#endif

OpenMP가 설치되어 있거나 설치되어 있지 않은 여러 시스템에서 실행됩니다.

그리고 분명히 말씀드리자면, 여러분은 아마도 각각의 기계에 프로그램을 구축해야 할 것입니다.x86_64 ABI가 OpenMP를 x86, x32 또는 x86_64 시스템에서 사용할 수 있다고 보장하지는 않습니다.한 시스템에서 빌드한 다음 다른 시스템에서 실행할 수 있다는 것을 읽지 않았습니다.

제가 좋아하는 또 다른 접근법이 있는데, Bisqwit에서 차용했습니다.

#if defined(_OPENMP)
#include <omp.h>
extern const bool parallelism_enabled = true;
#else
extern const bool parallelism_enabled = false;
#endif

그런 다음, 다음과 같은 루프에 대해 OpenMP 병렬을 시작합니다.

#pragma omp parallel for if(parallelism_enabled)

참고: 사용하지 않는 데에는 타당한 이유가 있습니다.pragma이는 비표준적이며, 따라서 구글과 다른 회사들이 이를 지원하지 않는 이유입니다.

언급URL : https://stackoverflow.com/questions/1300180/ignore-openmp-on-machine-that-does-not-have-it

반응형