我可以将多个线程分配给 OpenMP 中的代码段吗?

Posted

技术标签:

【中文标题】我可以将多个线程分配给 OpenMP 中的代码段吗?【英文标题】:Can I assign multiple threads to a code section in OpenMP? 【发布时间】:2011-09-06 16:12:38 【问题描述】:

我正在寻找一种方法来使用每个部分的多个线程并行执行代码部分。例如,如果我有 16 个线程和两个任务,我希望每个线程有 8 个线程同时执行这两个任务。 OpenMP 有多个并行执行通用代码的构造(sectiontask),但它们是单线程的。在我的场景中,使用 sectiontask 将导致一个线程执行这两个任务中的每一个,而 14 个线程闲置。

使用 OpenMP 是否也能做到这一点?如果是,我该怎么做,如果不是,我可以用什么来达到这个目的?

感谢您的宝贵时间!

编辑 2:

让我用一个示例代码来扩展这个问题:

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

【问题讨论】:

我刚刚用解决方案更新了我的答案。 【参考方案1】:

您可以使用嵌套的并行区域来做到这一点。

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

        
    

或者,您可以这样做:

#pragma omp parallel num_threads(16)

    if (omp_get_thread_num() < 8)
        //  Task 0
    else
        //  Task 1
    

请注意,如果 OpenMP 决定使用少于 16 个线程,则此代码将不起作用。您必须为此插入自己的清理代码。

编辑:响应您的更新:

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

【讨论】:

以上是关于我可以将多个线程分配给 OpenMP 中的代码段吗?的主要内容,如果未能解决你的问题,请参考以下文章

OpenMP 中的 C++ 动态内存分配速度较慢,即使对于非并行代码段也是如此

OpenMP C++ 中的线程

在 Openmp (C++) 中销毁线程

尝试在其线程函数参数中将不同的值传递给 openMp 线程

openmp怎么用函数配置线程数

Openmp 多线程代码在使用多个线程时给出不同的答案