2011-09-06 83 views
5

我正在尋找一種方法來並行執行代碼段使用多個線程爲每個部分。例如,如果我有16個線程和兩個任務,我需要8個線程來同時執行這兩個任務。 OpenMP有幾個並行執行通用代碼的構造(section,task),但它們是單線程的。在我的場景中,使用sectiontask將導致一個線程執行兩個任務中的每一個,而14個線程則無效。我可以將多個線程分配給OpenMP中的代碼部分嗎?

就像OpenMP一樣可能嗎?如果是這樣,我該怎麼做,如果沒有,我可以用什麼來達到這個目的?

謝謝你的時間!

編輯2:

讓我在這個問題上擴大與示例代碼:

class some_class{ 
    void task(){ 
     cout<<"Entering the task method"<<endl; 
     #pragma openmp parallel for 
      for(int i=0; i < large_matrix.rows(); i++){ 
       perform_thread_safe_operation(large_matrix.getRow(i)); 
      } 
    } 

    matrix large_matrix; 
}; 


void main(){ 
    //I have 16 cores, so I want to spawn 16 threads 
    some_class o1; 
    some_class o2; 
    // I want 8 of the 16 threads to execute this line: 
    o1.task(); 
    // and 8 remaining threads to execute this line: 
    o2.task(); 
} 
+0

我剛剛更新了我的一個解決方案的答覆。 – Mysticial

回答

8

爲此,您可以使用嵌套並行區域。

omp_set_nested(1); 

#pragma omp parallel num_threads(2) 
{ 
    if (omp_get_thread_num() == 0){ 
#pragma omp parallel num_threads(8) 
     { 

      // Task 0 

     } 
    }else{ 
#pragma omp parallel num_threads(8) 
     { 

      // Task 1 

     } 
    } 
} 

或者,你可以做這樣的:

#pragma omp parallel num_threads(16) 
{ 
    if (omp_get_thread_num() < 8){ 
     // Task 0 
    }else{ 
     // Task 1 
    } 
} 

注意,如果OpenMP的決定使用少於16個線程的代碼將無法正常工作。你將不得不插入你自己的清理代碼。

編輯:在回答你的更新:

class some_class{ 
    void task(){ 
     cout<<"Entering the task method"<<endl; 

#pragma omp parallel for num_threads(8) 
     for(int i=0; i < large_matrix.rows(); i++){ 
      perform_thread_safe_operation(large_matrix.getRow(i)); 
     } 
    } 

    matrix large_matrix; 
}; 


void main(){ 

    omp_set_nested(1); 

    //I have 16 cores, so I want to spawn 16 threads 
    some_class o1; 
    some_class o2; 

#pragma omp parallel num_threads(2) 
    { 
     if (omp_get_thread_num() == 0){ 
      // I want 8 of the 16 threads to execute this line: 
      o1.task(); 
     }else{ 
      // and 8 remaining threads to execute this line: 
      o2.task(); 
     } 
    } 
} 
相關問題