2011-10-21 50 views
15

Tôi có mã C++ với pragmas OpenMP bên trong. Tôi muốn kiểm tra mã này cả cho chế độ đa luồng (với OpenMP) và trong chế độ chủ đề đơn (không có OpenMP).Làm thế nào để vô hiệu hóa các chỉ thị OpenMP một cách tốt đẹp?

Hiện tại, để chuyển đổi giữa các chế độ tôi cần phải nhận xét #pragma omp (hoặc ít nhất parallel).

Cách sạch nhất hoặc mặc định, cách bật/tắt OpenMP là gì?

Trả lời

10

Xem hướng dẫn sử dụng trình biên dịch để tắt công tắc OpenMP. Đối với GCC, OpenMP bị tắt theo mặc định và được bật với tùy chọn -fopenmp.

Một tùy chọn khác là chạy mã với biến môi trường OMP_NUM_THREADS được đặt thành 1, mặc dù điều đó không chính xác giống như biên dịch không có OpenMP ở vị trí đầu tiên.

+0

viết mã với "#pragma omp ..." và sau đó _not_ enable -fopenmp khiến liên kết erros như "tham chiếu không xác định cho GOMP_parallel_start" –

+4

Tôi tìm thấy 'omp_set_num_threads (1)' hữu ích nhất (đáng buồn thay, không phải rất thanh lịch trong ý kiến) –

+0

Đối với dự án của chúng tôi, chúng tôi có WITH_OPENMP - một tùy chọn thời gian xây dựng boolean xử lý việc truyền -fopenmp và bất kỳ định nghĩa nào nếu chúng cần thiết. Id đề xuất điều này cho bất kỳ ai khác sử dụng openmp trong một dự án, khả năng kiểm tra mà không có openmp có thể hữu ích vào những thời điểm để loại trừ nó ra như là một nguyên nhân gây ra bất kỳ lỗi nào. – ideasman42

2

Cách điều như vậy thường được xử lý (các trường hợp chung) là với #define s và #ifdef:

Trong tập tin tiêu đề của bạn:

#ifndef SINGLETHREADED 
#pragma omp 
#endif 

Khi bạn biên dịch, thêm -DSINGLETHREADED để vô hiệu hóa OpenMP:

cc -DSINGLETHREADED <other flags go here> code.c 
25

Nếu bạn không biên dịch với tùy chọn -fopenmp, bạn sẽ không nhận được mã song song. Bạn có thể làm điều đó với một định nghĩa và makefile appropiate tạo ra tất cả các mã.

Các tài liệu OpenMP nói (chỉ là ví dụ):

#ifdef _OPENMP 
    #include <omp.h> 
#else 
    #define omp_get_thread_num() 0 
#endif 

Xem http://www.openmp.org/mp-documents/spec30.pdf (biên soạn có điều kiện).

+0

Điều kiện trên vẫn hoạt động mà không cung cấp câu lệnh khác. – sinner

Các vấn đề liên quan