OpenMP: Sections

Openmp: Section

先前,我们用OpenMP中的for子句可以对循环进行并行。循环里的代码通常是一样的。那么如果想并行运行不同的代码,我们就要使用Section子句。

例子:

#pragma omp parallel 
{
    #pragma omp sections
    {
        #pragma omp section
        {
            // structured block 1
        }
        
        #pragma omp section
        {
            // structured block 2
        }

        #pragma omp section
        {
            // structured block 3
        }           
        
        ...
    }
}

parallel语句创建了线程队,其中的线程都用来并行执行。

sections语句标记了section结构的开始。这个块里将会包含数个section结构,每个section都标记了不同的块,也代表了 一个任务。注意,一定要区分好sectionsections,这两个有不同的意思。

sections结构要求不同的section之间必须独立于其他块,然后每个线程一次执行一个块,每个块仅由一个线程执行一次。

OpenMP并没有规定这些块的执行顺序。如果任务多于线程,一些线程将执行多个块,如果线程多于任务,一些线程将会空闲。

如果parallel中只有一个sections块,我们可以将其合并

#pragma omp parallel sections
{
    ...
}

参看:http://www.openmp.org/mp-documents/openmp-4.5.pdf

Example

void function_1()
{
    for (int i = 0; i != 3; i++)
    {
        std::cout << "Function 1 (i = " << i << ")" << std::endl;
        std::this_thread::sleep_for(std::chrono::seconds(1));
    }
}

void function_2()
{
    for (int j = 0; j != 4; j++)
    {
        std::this_thread::sleep_for(std::chrono::milliseconds(500));
        std::cout << "                   Function 2 "
                  << "(j = " << j << ")" << std::endl;
    }
}

上面的代码给出了两个函数,我们在函数里实现了打印信息。然后我们用sleep_for函数来延迟两次迭代之间的打印。

主函数为:

int main()
{
    #pragma omp parallel sections
    {    
        #pragma omp section
        function_1();
            
        #pragma omp section
        function_2();
    }

    return 0;
}

程序一开始,OpenMP会创建一个线程队(team of threads),然后OpenMp将会分配可用的线程给这两个函数。

如果说线程的数量多于1,那么程序运行就是并行的,如果少于1,程序串行。

程序输出

$ ./ompSection 
Function 1 (i = 0)
                   Function 2 (j = 0)
Function 1 (i = 1)
                   Function 2 (j = 1)
                   Function 2 (j = 2)
Function 1 (i = 2)
                   Function 2 (j = 3)

 

1条评论

回复 优才圈 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据