2011-10-24 88 views
5

我有一個CPU消耗函數do_long,我需要在兩個不同的數據集上運行。OpenMP:並行運行兩個函數,每個運行線程池的一半

do_long(data1); 
do_long(data2); 

do_long() { 
#pragma omp for 
    for(...) { 
     // do proccessing 
    } 
} 

我有N個線程可用(取決於機器)。如何告訴OpenMP我希望do_long 函數並行運行,並且N/2個線程應該在第一個do_long中執行循環,另一個N/2應該處理第二個do_long

回答

5

一種方法是使用嵌套並行做到這一點:

void do_long(int threads) { 
#pragma omp parallel for num_threads(threads) 
    for(...) { 
     // do proccessing 
    } 
} 


int main(){ 
    omp_set_nested(1); 

    int threads = 8; 
    int sub_threads = (threads + 1)/2; 

#pragma omp parallel num_threads(2) 
    { 
     int i = omp_get_thread_num(); 

     if (i == 0){ 
      do_long(data1, sub_threads); 
     } 
     if (i == 1 || omp_get_num_threads() != 2){ 
      do_long(data2, sub_threads); 
     } 
    } 

    return 0; 
}