我在裏面有OpenMP pragmas的C++代碼。我想測試這個代碼,用於多線程模式(使用OpenMP)和單線程模式(不使用OpenMP)。如何以不錯的方式禁用OpenMP指令?
現在,要切換模式我需要評論#pragma omp
(或至少parallel
)。
啓用/禁用OpenMP的最簡潔或默認方式是什麼?
我在裏面有OpenMP pragmas的C++代碼。我想測試這個代碼,用於多線程模式(使用OpenMP)和單線程模式(不使用OpenMP)。如何以不錯的方式禁用OpenMP指令?
現在,要切換模式我需要評論#pragma omp
(或至少parallel
)。
啓用/禁用OpenMP的最簡潔或默認方式是什麼?
查看禁用OpenMP的交換機的編譯器手冊。對於GCC,默認情況下禁用OpenMP,並使用-fopenmp選項啓用。
另一種選擇是運行OMP_NUM_THREADS環境變量設置爲1的代碼,儘管這與首先沒有使用OpenMP進行編譯並不完全相同。
的方式這樣的事情通常處理(通常情況下)是#define
S和#ifdef
:
在你的頭文件:
#ifndef SINGLETHREADED
#pragma omp
#endif
當你編譯,添加-DSINGLETHREADED禁用OpenMP的:
cc -DSINGLETHREADED <other flags go here> code.c
如果不使用-fopenmp選項進行編譯,則不會得到並行代碼。你可以用適當的定義和生成所有代碼的makefile來完成。
OpenMP編譯文件說(只是一個例子):
#ifdef _OPENMP
#include <omp.h>
#else
#define omp_get_thread_num() 0
#endif
上述條件仍然可以不提供else語句。 – sinner
編寫的代碼「的#pragma OMP ......」,後來_not_使-fopenmp原因鏈接誤差修改,如「未定義的引用GOMP_parallel_start」 –
我發現'OMP_SET_NUM_THREADS(1)'最有用(不幸的是,不是很優雅的我意見) –
對於我們的項目,我們有WITH_OPENMP - 布爾編譯時間選項,處理傳遞-fopenmp和任何定義,如果他們需要。編號建議這個給任何在項目中使用openmp的人,沒有openmp測試的能力有時可以用來排除任何bug的原因。 – ideasman42