2015-01-10 62 views
2

我有這樣的代碼:的OpenMP:具有「for」循環完全進入每個線程

#pragma omp parallel 
{ 
    #pragma omp single 
    { 
    for (int i=0; i<given_number; ++i) myBuffer_1[i] = myObject_1->myFunction(); 
    } 

    #pragma omp single 
    { 
    for (int i=0; i<given_number; ++i) myBuffer_2[i] = myObject_2->myFunction(); 
    } 
} 

// and so on... up to 5 or 6 of myObject_x 

// Then I sum up the buffers and do something with them 
float result; 
for (int i=0; i<given_number; ++i) 
    result = myBuffer_1[i] + myBuffer_2[i]; 

// do something with result 

如果我運行此代碼,我得到了我期待,但CPU的使用率看起來相當高。相反,如果我在沒有OpenMP的情況下正常運行它,我會得到相同的結果,但CPU使用率要低得多,儘管運行在單個線程中。

我不想指定多個線程,我希望程序根據CPU能力選擇最大線程數,但我希望每個for循環完全在其自己的線程中運行。我怎樣才能做到這一點?

而且,我的期望是,for環路myBuffer_1運行一個線程,其他for循環運行另一個線程,剩下的「主」線程中運行。它是否正確?

回答

0
  1. #pragma omp single有一個最後的隱式屏障,你需要使用#pragma omp single nowait如果你希望兩個single塊同時運行。

  2. 但是,對於您的要求,使用section可能是一個更好的主意

    #pragma omp parallel 
    { 
        #pragma omp sections 
        { 
         #pragma omp section 
         { 
          for (int i=0; i<given_number; ++i) myBuffer_1[i] = myObject_1->myFunction(); 
         } 
         #pragma omp section 
         { 
          for (int i=0; i<given_number; ++i) myBuffer_2[i] = myObject_2->myFunction(); 
         } 
        } 
    
    } 
    
+0

我想'single'之前'sections'嘗試過了,我使用'nowait',我永遠也嘗試得到相同的結果:我的程序運行17個線程,其中7個佔用CPU總量的12,50%,即使處理過程是「空閒」。 CPU是一個i7(8線程)。 –

+0

發佈一個最小的可運行測試用例,該bug必須在其他地方。 – Dikei

+0

我編輯了我的文章中的示例代碼,因爲總結緩衝區的'for'循環必須在主線程中執行。順便說一句,'myObject_x'的函數'myFunction()'只是做一系列非常複雜的計算並返回一個數字,我不認爲問題在那裏,因爲它們在沒有OpenMP的情況下運行良好。只是我不知道如何讓每個'for'循環並行運行在它自己的線程中。 –