我可以在OpenMP分配多个线程到一个代码段

Can I assign multiple threads to a code section in OpenMP?

本文关键字:一个 代码 线程 OpenMP 分配 我可以      更新时间:2023-10-16

我正在寻找一种方法来并行执行代码的部分使用多个线程为每个部分。例如,如果我有16个线程和两个任务,我想要8个线程同时执行这两个任务。OpenMP有几个并行执行一般代码的结构(section, task),但它们是单线程的。在我的场景中,使用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();
}

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

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();
       }
   }
}
相关文章: