我正在从这个paper读取此伪代码算法的伪代码,我无法完全理解它。
代码的目标是为多个线程创建一个障碍(线程不能通过障碍,除非所有线程都已完成),使用名为"软件组合树" (不确定它是什么意思)
这是伪代码(虽然我也鼓励你看一下这篇文章)
type node = record
k : integer // fan-in of this node
count : integer // initialized to k
locksense : Boolean // initially false
parent : ^node // pointer to parent node; nil if root
shared nodes : array [0..P-1] of node
// each element of nodes allocated in a different memory module or cache line
processor private sense : Boolean := true
processor private mynode : ^node // my group's leaf in the combining tree
procedure combining_barrier
combining_barrier_aux (mynode) // join the barrier
sense := not sense // for next barrier
procedure combining_barrier_aux (nodepointer : ^node)
with nodepointer^ do
if fetch_and_decrement (&count) = 1 // last one to reach this node
if parent != nil
combining_barrier_aux (parent)
count := k // prepare for next barrier
locksense := not locksense // release waiting processors
repeat until locksense = sense
我知道这意味着要构建一个二叉树,但我并不了解一些事情。
答案 0 :(得分:0)
只是一个猜测,而不是一个真正的答案
节点可能构成具有P / 2叶子的完整二叉树,其中P是线程数。每个叶子都分配了两个线程。
每个叶子上的线程相遇,并决定哪个将是“活动的”,哪个将是“被动的”。被动线程在活动线程组合它们的两个输入时移动并向上移动到父节点以满足来自兄弟叶子的活动线程。然后这两个选择一个活动成员,并重复该过程,向上移动树,直到一个线程在根目录下被选为“活动”。
根处的活动线程执行最终计算,生成结果,然后 然后整个东西展开,并且所有被动线程都被通知结果,并被释放以执行他们将要做的任何事情。
答案 1 :(得分:0)
是的
这被称为正在构建的树的ary-ness。这是一个二叉树,因此k = 2.想法是对于较少数量的处理器,二叉树就足够了。但随着处理器数量的增加,树中的级别会增长很多。通过增加k的值来增加ary-ness来平衡这一点。这基本上可以使两个以上的处理器成为叶子或组的一部分。随着系统通过互连扩展到数千个处理器,这可能很重要。这方面的缺点是争议增加。随着越来越多的处理器成为同一棵树的一部分,它们将在相同的变量上旋转。
线程被组织成等于叶数的组。叶子数基本上是线程数除以 ary-ness 或k。因此,对于一组8个线程,k = 2,叶子的数量将为4.这允许组中的线程旋转单个变量,并且还可以跨多个变量分配旋转,而不是单个共享变量与基本的集中屏障算法一样。
每个线程只有一个节点吗?
答案是否。当然,至少有与叶子一样多的节点。对于8线程问题,4个叶子将有4个节点。现在,在这个平坦的关卡之后,"获胜者"(最后的线程)将以递归方式爬升到其父级。级别数将为log P to base k
。对于每个父节点,将有一个节点,最终爬到真正的根节点或父节点。
例如对于8线程问题,将有4 + 2 + 1 = 7个节点。
如何在组合树中获得"我的小组"?
这是一个有点棘手的部分。有一个基于模数和一些整数除法的公式。但是,我还没有看到公开的实施。对不起,我无法透露我在课堂上看到的内容,因为这可能不合适。可能是谷歌搜索或其他人可以填写此内容。