当前团队线程的关键区域

时间:2012-02-01 14:21:59

标签: openmp parallel-processing

我希望一段代码对当前的线程团队至关重要,而不是全局关键。 我怎样才能实现这个目标?

quick-sort(args)
{
    spawn threads #x
    {
       critical-region
       {
            // code
       }
    }
    quick-sort(args)
    quick-sort(args)
}

这里open-mp critical-region结构将在访问关键区域之前阻塞所有线程。但是,只要它们没有同时生成,我就没有问题,两个线程进入关键区域。我想要一个openMP的解决方案。

1 个答案:

答案 0 :(得分:1)

您不能使用#pragma omp critical执行此操作,但可以使用OpenMP锁:

quick-sort(args)
{
    declare an instance of OpenMP lock
    omp_init_lock( the lock instance )
    spawn threads #x
    {
       // critical-region
       omp_set_lock( the lock instance )
       {
            // code
       }
       omp_unset_lock( the lock instance )
    }
    omp_destroy_lock( the lock instance )
    quick-sort(args)
    quick-sort(args)
}

由于quick-sort的每次调用都会声明自己的锁定对象,因此它会为您提供所需的内容。

但是,从你的伪代码看,你似乎永远不会有两个不同的线程团队同时运行,除非在其他函数中有OpenMP并行区域。如果唯一具有并行区域的代码(“生成线程”)在quick-sort中,则需要从并行区域内对该函数进行递归调用,而不是。