如何在openMP中的单个区域内并行循环?

时间:2015-05-18 03:58:15

标签: c++ openmp

我有一个递归程序,我希望使用openMP加速。结构如下所示。

我对omp task不熟悉,只是从here学到了一些东西。似乎我必须将buildTree包裹在omp single区域中。

但是,我还想在buildTree内并行化for循环,我该如何实现呢?

int main()
{
    #pragma omp parallel 
    {
        #pragma omp single nowait
        buildTree();
    }
}
void buildTree
{
    if(endRecursion)
        return;
    for(int i = 0; i < problemSize; i++)
    {
        // I want to parallelize these code using omp for
    }

    if(problemSizeIsSmall)
    {
        buildTree(subProblemSize); // left subtree
        buildTree(subProblemSize); // right subtree
    }
    else
    {
        #pragma omp task
        {
            buildTree(subProblemSize); // left subtree
        }
        #pragma omp task
        {
            buildTree(subProblemSize); // right subtree
        }
    }
}

1 个答案:

答案 0 :(得分:1)

我认为您可以在问题中使用nested parallelism。 您的代码在main()

中看起来就像这样
#pragma omp parallel for num_threads(2)
buildTree();

buildTree()

omp_set_num_threads(4); // 4 or whatever number of threads you want
#pragma omp parallel for 
for(int i = 0; i < problemSize; i++)

查看我first linkExample 4–2 Calls to OpenMP Routines Within Parallel Regions部分了解详情