如何在OpenMP中分叉大量线程?

时间:2015-01-27 00:52:55

标签: c multithreading openmp

出于某种原因,我需要强调我的处理器,我想在OpenMP中分叉很多线程。在pthreads中,您可以使用for循环轻松完成它,因为它分叉线程只是一个函数调用。但是在OpenMP中你必须有这样的东西:

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

我只是想知道是否有更简单的方法在OpenMP中分叉大量线程?

2 个答案:

答案 0 :(得分: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)
}  

答案 1 :(得分: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();
    } 
}