2011-10-21 55 views
15

我在裏面有OpenMP pragmas的C++代碼。我想測試這個代碼,用於多線程模式(使用OpenMP)和單線程模式(不使用OpenMP)。如何以不錯的方式禁用OpenMP指令?

現在,要切換模式我需要評論#pragma omp(或至少parallel)。

啓用/禁用OpenMP的最簡潔或默認方式是什麼?

回答

10

查看禁用OpenMP的交換機的編譯器手冊。對於GCC,默認情況下禁用OpenMP,並使用-fopenmp選項啓用。

另一種選擇是運行OMP_NUM_THREADS環境變量設置爲1的代碼,儘管這與首先沒有使用OpenMP進行編譯並不完全相同。

+0

編寫的代碼「的#pragma OMP ......」,後來_not_使-fopenmp原因鏈接誤差修改,如「未定義的引用GOMP_parallel_start」 –

+4

我發現'OMP_SET_NUM_THREADS(1)'最有用(不幸的是,不是很優雅的我意見) –

+0

對於我們的項目,我們有WITH_OPENMP - 布爾編譯時間選項,處理傳遞-fopenmp和任何定義,如果他們需要。編號建議這個給任何在項目中使用openmp的人,沒有openmp測試的能力有時可以用來排除任何bug的原因。 – ideasman42

2

的方式這樣的事情通常處理(通常情況下)是#define S和#ifdef

在你的頭文件:

#ifndef SINGLETHREADED 
#pragma omp 
#endif 

當你編譯,添加-DSINGLETHREADED禁用OpenMP的:

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

如果不使用-fopenmp選項進行編譯,則不會得到並行代碼。你可以用適當的定義和生成所有代碼的makefile來完成。

OpenMP編譯文件說(只是一個例子):

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

http://www.openmp.org/mp-documents/spec30.pdf(條件編譯)。

+0

上述條件仍然可以不提供else語句。 – sinner