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

Posted

技术标签:

【中文标题】如何在 OpenMP 中分叉大量线程?【英文标题】:How to fork a large number of threads in OpenMP? 【发布时间】:2015-01-27 00:52:54 【问题描述】:

出于某种原因,我需要对我的处理器施加压力,并且我想在 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 中分叉大量线程?

【问题讨论】:

你的意思是:#pragma omp parallel ... num_threads(100) @Mysticial 但我不想在并行区域内复制#pragma omp section,我只需要在 100 个线程上运行的两个部分,50 个运行部分 0 和 50 个运行部分 1,我该怎么做去做? (不确定我是否对此完全确定)。 【参考方案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)
  

【讨论】:

【参考方案2】:

要做你想做的事,你得到线程号,然后根据你是哪个线程做不同的事情。

// 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();
     

【讨论】:

以上是关于如何在 OpenMP 中分叉大量线程?的主要内容,如果未能解决你的问题,请参考以下文章

在 openMP 中,如何确保线程在继续之前同步?

有没有一种方法可以让 OpenMP 在 Qt spanwed 线程上运行?

如何编写在 C++ openmp 上重用线程的代码?

如何使用多线程处理缓存的数据结构(例如 openmp)

如何获得在整个程序执行期间可能创建的最大 OpenMP 线程数?

如何不等待 OpenMP 中的其他线程?