我希望一段代码是关键的当前团队的线程,而不是全局关键。我如何才能做到这一点??
quick-sort(args)
{
spawn threads #x
{
critical-region
{
// code
}
}
quick-sort(args)
quick-sort(args)
}这里,open-mp critical-region构造将在访问临界区之前阻塞所有线程。但只要两个线程不是同时产生的,我就不会对进入临界区的两个线程产生问题。我想要一个针对openMP的解决方案。
发布于 2012-02-01 22:55:08
你不能用#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中,那么您将需要从并行区域内部递归调用该函数,而您没有这样做。
https://stackoverflow.com/questions/9097392
复制相似问题