我有一个递归程序,我希望使用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
}
}
}
答案 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 link的Example 4–2 Calls to OpenMP Routines Within Parallel Regions
部分了解详情