当前团队线程的关键区域

问题描述:

我想要一段代码对于当前线程团队至关重要,而不是全局关键。 我怎样才能做到这一点?当前团队线程的关键区域

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中,则需要从并行区域内对该函数进行递归调用,而不是这样。

+0

谢谢..特别是最后一行。我想我已经找出了减速的原因。 – 2012-02-01 15:24:32