当前团队线程的关键区域
问题描述:
我想要一段代码对于当前线程团队至关重要,而不是全局关键。 我怎样才能做到这一点?当前团队线程的关键区域
quick-sort(args)
{
spawn threads #x
{
critical-region
{
// code
}
}
quick-sort(args)
quick-sort(args)
}
这里的开放MP临界区构造将在访问关键区域之前阻塞所有线程。但是,我并没有遇到两个线程进入关键区域的问题,只要它们不会同时产生。我想要一个openMP的解决方案。
答
你不能做到这一点与#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并行区域。如果只有具有并行区域的代码(“spawns threads”)在quick-sort
中,则需要从并行区域内对该函数进行递归调用,而不是这样。
谢谢..特别是最后一行。我想我已经找出了减速的原因。 – 2012-02-01 15:24:32