2011-11-28 82 views
2

我有4核心的計算機和OMP應用程序與2重任務。OpenMP,使用並行的所有核心

int main() 
{ 
    #pragma omp parallel sections 
    { 
     #pragma omp section 
     WeightyTask1(); 

     #pragma omp section 
     WeightyTask2(); 
    } 

    return 0; 
} 

每個任務都有這樣有分量的組成部分:

#omp pragma parallel for 
for (int i = 0; i < N; i++) 
{ 
    ... 
} 

我編譯的程序與-fopenmp參數,做出export OMP_NUM_THREADS=4問題只有兩個核心加載。我如何在我的任務中使用所有內核?

+0

我應該用兩個'for'循環? (i從0到N/2 - 1)和(i從N/2到N-1)? –

回答

2

我最初的反應是:你必須聲明更多的並行性。

您已經定義了兩個可以並行運行的任務。 OpenMP在兩個以上內核上運行它的任何嘗試都會使你放慢速度(由於緩存局部性和可能的​​錯誤共享)。

編輯如果並行for循環任何顯著量(比如,不低於8次迭代),而您沒有看到使用超過2個內核,看看

  • omp_set_nested()
  • OMP_NESTED=TRUE|FALSE environment variable

    此環境變量啓用或禁用嵌套並行。通過調用omp_set_nested()運行時庫函數,可以覆蓋此環境變量的設置。

    如果嵌套並行被禁用,則嵌套並行區域將被序列化並在當前線程中運行。

    在當前的實現中,嵌套並行區域總是被序列化。因此,OMP_SET_NESTED不起作用,並且omp_get_nested()始終返回0.如果啓用了-qsmp = nested_pa​​r選項(僅在非嚴格OMP模式下),則嵌套並行區域可能會使用其他可用線程。但是,不會創建新的團隊來運行嵌套並行區域。 OMP_NESTED的默認值爲FALSE。

+0

謝謝。我會試試這個。 –

+0

是的,就是這樣。謝謝。 –