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 simd
OpenMP 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
'programing' 카테고리의 다른 글
MariaDB: 원격 액세스에서 액세스가 거부되었지만 사용 권한이 있어야 합니다. (0) | 2023.07.30 |
---|---|
DOM의 특정 요소에서 HTML+CSS+JS를 선택적으로 복사하는 도구 (0) | 2023.07.30 |
파이썬에서 파일이 심볼릭 링크인지 확인하는 방법은 무엇입니까? (0) | 2023.07.25 |
if 문 정수 (0) | 2023.07.25 |
이 작업을 수행하려면 ORA-02069 global_names 매개 변수를 TRUE로 설정해야 합니다. (0) | 2023.07.25 |