2011-09-06 9 views
5

Her bölüm için birden fazla iş parçacığı kullanarak kod bölümlerini paralel olarak yürütmenin bir yolunu arıyorum. Örneğin, 16 iş parçacığım ve iki görevim varsa, bu iki görevi aynı anda yürütmek için her biri 8 iş parçacığı istiyorum. OpenMP, genel kodu paralel olarak yürüten birkaç yapılandırmaya (section, task) sahiptir, ancak bunlar tek iş parçacıklıdır. Benim senaryoda, section veya task kullanarak, 14 iş parçacığı tarafından boş yere otururken, iki görevden birini yürüten bir iş parçacığı ile sonuçlanır.OpenMP'de bir kod bölümüne birden fazla iş parçacığı atayabilir miyim?

OpenMP'de bile böyle bir şey var mı? Eğer öyleyse, bunu nasıl yaparım ve değilse, bu amaçla ne kullanabilirim?

Zaman ayırdığınız için teşekkürler!

düzenlemek 2:

bana bir örnek kodunu bu soru üzerine genişletelim: Bu kullanarak iç içe paralel bölgeleri yapabilirsiniz

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

Ben sadece bir çözüm ile benim cevap güncellendi. – Mysticial

cevap

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 

     } 
    } 
} 

Alternatif olarak, böyle yapabileceğini:

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

Not, OpenMP az 16 konuları kullanmaya karar verirse bu kod çalışmaz. Bunun için kendi temizleme kodunuzu eklemeniz gerekecek.

DÜZENLEME: Güncellemenize cevaben:

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(); 
     } 
    } 
} 
İlgili konular