2009-08-19 7 views
24

Tôi có một chương trình C++ sử dụng OpenMP, sẽ chạy trên một số máy có thể có hoặc không có OpenMP được cài đặt.Bỏ qua OpenMP trên máy không có nó

Làm cách nào để chương trình của tôi biết nếu máy không có OpenMP và bỏ qua các số #include <omp.h>, chỉ thị OpenMP (như #pragma omp parallel ...) và/hoặc chức năng thư viện (như tid = omp_get_thread_num();)?

+1

Vui lòng xem câu trả lời của Andrew. Điều tốt nhất tôi có thể nói, anh ấy là người duy nhất thực sự trả lời câu hỏi (và đã làm đúng). Xem thêm [Preprocessor định nghĩa nào -fopenmp cung cấp?] (Http://stackoverflow.com/q/30803126) – jww

Trả lời

1

OpenMP là một thời gian chạy trình biên dịch và không phải là điều nền tảng.

tức là. Nếu bạn biên dịch ứng dụng của mình bằng Visual Studio 2005 hoặc cao hơn, thì bạn luôn có sẵn OpenMP khi thời gian chạy hỗ trợ nó. (và nếu người dùng cuối không cài đặt thời gian chạy Visual Studio C, thì ứng dụng của bạn sẽ không hoạt động).

Vì vậy, bạn không cần phải lo lắng, nếu bạn có thể sử dụng nó, nó sẽ luôn ở đó giống như các hàm như strcmp. Để đảm bảo rằng họ có CRT, bạn có thể cài đặt studio trực quan có thể phân phối lại.

chỉnh sửa:

ok, nhưng GCC 4.1 sẽ không thể để biên dịch ứng dụng OpenMP của bạn, vì vậy vấn đề không phải là máy tính mục tiêu, nhưng trình biên dịch mục tiêu. Vì tất cả các trình biên dịch đều có các macro được xác định trước cho phiên bản của chúng, hãy gói các cuộc gọi OpenMP của bạn bằng các khối #ifdef. ví dụ: GCC sử dụng 3 macro để xác định phiên bản trình biên dịch, __GNUC__, __GNUC_MINOR__ and __GNUC_PATCHLEVEL__

+0

Vấn đề của tôi là tôi muốn chạy chương trình mà không cần đa luồng trên những máy không có nó. GCC bên dưới phiên bản 4.2.x không hỗ trợ OpenMP. Vì vậy, tôi muốn làm cho Makefile của tôi có thể nói điều này và yêu cầu g ++ bỏ qua phần OpenMP trong chương trình của tôi thay vì không biên dịch. Bất kỳ ý tưởng? – Tim

+3

-1: Phiên bản trình biên dịch hoàn toàn không đầy đủ. Cả hai trình biên dịch và thời gian chạy phải hỗ trợ _mp_ openmp nó phải được _enabled_ quá. Phiên bản trình biên dịch tương tự có thể hỗ trợ openmp trên một máy tính và không hỗ trợ nó trên một máy tính khác. –

19

Trình biên dịch có nghĩa vụ bỏ qua #pragma chỉ thị mà chúng không hiểu; đó là toàn bộ điểm của cú pháp. Và các hàm được định nghĩa trong openmp.h có nghĩa đơn giản được xác định rõ ràng trên một hệ thống không song song - đặc biệt, tệp tiêu đề sẽ kiểm tra xem trình biên dịch có định nghĩa ENABLE_OPENMP và không.

Vì vậy, tất cả những gì bạn cần là bản sao của openmp.h để liên kết tới. Đây là một: http://cms.mcc.uiuc.edu/qmcdev/docs/html/OpenMP_8h-source.html.

Phần liên quan của mã này, tuy nhiên, chỉ sau:

#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 

Tại tồi tệ nhất, bạn có thể chỉ mất những ba dòng và đặt chúng trong một openmp.h tập tin dummy, và sử dụng. Phần còn lại sẽ chỉ hoạt động.

+11

+1 cho ngữ nghĩa '# pragma'. -1 cho 'ENABLE_OPENMP', không tuân thủ tiêu chuẩn. Sử dụng '_OPENMP' để thay thế. – YvesgereY

+0

* "... tệp tiêu đề sẽ kiểm tra xem trình biên dịch có định nghĩa ENABLE_OPENMP" * - tôi không nghĩ điều này là đúng.Bạn có thể cung cấp tham chiếu cho 'ENABLE_OPENMP' không? Tôi không thể tìm thấy nó trong preprocessor định nghĩa. Xem [Preprocessor định nghĩa nào -fopenmp cung cấp?] (Http://stackoverflow.com/q/30803126) – jww

+0

Tôi đang biên dịch với clang 3.6.2 và 'clang ++ -fopenmp' cho tôi biết _OPENMP không được định nghĩa. – Arne

48

OpenMP biên soạn bổ sung thêm định nghĩa Preprocessor "_OPENMP", vì vậy bạn có thể làm:

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

Đối với một số ví dụ, xem http://bisqwit.iki.fi/story/howto/openmp/#Discussion và mã mà sau.

+5

Không cần thiết phải bảo vệ #pragma omp, vì pragma đó không xâm nhập (được bỏ qua một cách an toàn khi openmd không được kích hoạt). – YvesgereY

+9

Trong khi đúng, nếu một người thích biên dịch mà không có cảnh báo ngay cả dưới -Wall sau đó một thông điệp trình biên dịch như "cảnh báo: không rõ pragma bỏ qua" sẽ gây phiền nhiễu. –

+2

Về cảnh báo biên dịch, tôi sử dụng để biên dịch với '-Wno-unknown-pragmas' vì lý do này. Vấn đề: có thể ảnh hưởng đến các pragmas khác trong dự án và loại bỏ các cảnh báo hữu ích. –