2014-01-07 65 views
3

我想在VirtualBox上的Linux中的QtCreator中使用OpenMP並行化一部分C++程序。主機系統有4個cpu。由於我最初嘗試使用openmp pragma似乎不起作用(使用openmp的代碼幾乎與沒有使用openmp的代碼幾乎相同),我回到了OpenMP wiki並試圖運行這個簡單的示例。VirtualBox中的Qt中的OpenMP只使用一個線程

int main(void) 
    { 
     #pragma omp parallel 
     printf("Hello, world.\n"); 
     return 0; 
    } 

,輸出只是

'Hello, world'. 

我也試着運行這段代碼

int main() { 
    int thread_number; 
    #pragma omp parallel private(thread_number) 
    { 
     #pragma omp for schedule(static) nowait 
     for (int i = 0; i < 50; i++) { 
      thread_number = omp_get_thread_num(); 
      cout << "Thread " << thread_number << " says " << i << endl; 
     } 
    } 
    return 0; 
} 

,輸出是:

Thread 0 says 0 
Thread 0 says 1 
Thread 0 says 2 
. 
. 
. 
. 
Thread 0 says 49 

所以看起來就像沒有並行發生一樣畢竟。我在.pro文件中設置了QMAKE_CXXFLAGS + = -fopenmp QMAKE_LFLAGS + = -fopenmp。發生這種情況是因爲我正在從虛擬機運行它嗎?我如何使多線程在這裏工作?我真的很感激任何建議/指針。謝謝。

+0

用'g ++ -fopenmp omp.cpp &&。/ a.out'編譯代碼對我來說輸出4個Hello World,所以你的virtualbox有可疑的事情發生,也許試試qemu? – OneOfOne

+0

即使虛擬機只模擬單個CPU內核,多線程也可以在虛擬機中正常工作。可能是'-fopenmp'選項沒有使它成爲編譯器選項,或者您正在使用不支持OpenMP(尚)的Clang。 –

回答

0

嘗試設置環境變量OMP_NUM_THREADS。如果你的虛擬機說它有一個單一的內核,這個默認值可能是1(這發生在我身上)。

1

你的問題是,VirtualBox總是默認爲一個核心的機器。轉至設置/系統/處理器,並將CPU數量增加到硬件線程數(在您的案例中爲4個,如果您有超線程,則爲8個)。如果你有超線程技術,VirtualBox會警告你選擇了比物理CPU更多的CPU。忽略警告。

我把我的CPU設置爲8。當我在Windows上的GCC中使用OpenMP時,我得到八個線程。

編輯:根據VirtualBox's manaual,應該將線程數設置爲物理內核數而不是超線程數。

但是,您不應將虛擬機配置爲使用比物理上可用的更多CPU內核(真實核心,無超螺紋)。