2015-01-27 60 views
0

由於某些原因,我需要強調我的處理器,並且我想在OpenMP中分配很多線程。在pthread中,你可以很容易地使用for循環來完成它,因爲它分叉的線程只是一個函數調用。但在OpenMP的,你必須有這樣的事情:如何在OpenMP中派生大量線程?

#pragma omp parallel sections 
{ 
    #pragma omp section 
    { 
     //section 0 
    } 
    #pragma omp section 
    { 
     //section 1 
    } 
    .... // repeat omp section for n times 
} 

我只是想知道是否有叉大量的OpenMP線程的任何更簡單的方法?

+5

你的意思是這樣的:'的#pragma OMP並行... NUM_THREADS(100)' – Mysticial 2015-01-27 00:57:01

+0

@Mysticial但我不想複製''的#pragma OMP section''並行區域裏面,我只需要兩個部分運行100個線程,50個運行部分0和50個運行部分1,我該怎麼做? (不知道我是否絕對確信這一點)。 – dorafmon 2015-01-27 01:17:23

回答

1

你不需要做任何特別的事情,差不多。只需編寫計算密集型任務的代碼並將其放入並行區域即可。然後指出你想要的線程數。爲此,您使用omp_set_dynamic(0)來禁用動態線程(這有助於實現所需的線程數,但仍不能保證),然後omp_set_num_threads(NUM_THREADS)來指示您想要的線程數。

然後每個線程都會克隆你在代碼中指明的任務。就那麼簡單。

const int NUM_THREADS = 100; 
omp_set_dynamic(0); 
omp_set_num_threads(NUM_THREADS); 
#pragma omp parallel 
{ 
    // How many threads did we really get? Let's write it once only. 
    #pragma omp single 
    { 
     cout << "using " << omp_get_num_threads() << " threads." << std::endl; 
    } 
    // write some compute-intensive code here 
    // (be sure to print the result at the end, so that 
    // the compiler doesn't throw away useless instructions) 
} 
0

要做你想要的,你得到線程號,然後根據你是哪個線程做不同的事情。

// it's not guaranteed you will actually get this many threads 
omp_set_num_threads(NUM_THREADS); 

int actual_num_threads; 
#pragma omp parallel 
{ 
    #pragma omp single 
    { 
     actual_num_threads = omp_get_num_threads(); 
    } 

    int me = omp_get_thread_num(); 

    if (me < actual_num_threads/2) { 
     section1(); 
    } 
    else { 
     section2(); 
    } 
}