我希望一段代码对当前的线程团队至关重要,而不是全局关键。 我怎样才能实现这个目标?
quick-sort(args)
{
spawn threads #x
{
critical-region
{
// code
}
}
quick-sort(args)
quick-sort(args)
}
这里open-mp critical-region结构将在访问关键区域之前阻塞所有线程。但是,只要它们没有同时生成,我就没有问题,两个线程进入关键区域。我想要一个openMP的解决方案。
答案 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
中,则需要从并行区域内对该函数进行递归调用,而不是。