2.3.3 屏障
接下来介绍的是核心API在执行屏障时的调用操作:
与其他的屏障实现不同,GASNet中的同步实现是“分阶段”且支持可选的id匹配。
GASNet的分阶段屏障特性在gasnet_barrier_wait的规范描述中非常明显,其描述为“这是一个只有在所有节点调用gasnet_barrier_notify()函数完成后返回的阻塞操作”。简而言之,假设“notify”递增一个到达计数器,则“wait”将一直处于阻塞状态直至计数器与任务大小相等。gasnet_barrier_try函数同样需要满足上述条件,但是如果未能满足,则会立即返回GASNET_ERROR_NOT_READY的值。完成屏障操作无论使用的是“wait”还是“try”函数,在初始化与完成之间执行大部分GASNet操作都是合法的。
屏障函数中的id和flags参数实现了屏障过程可选匹配。这部分内容建议读者仔细阅读规范手册,这里列举了两个易于理解的用户示例:
- 异步屏障
最简单的情况是不使用id匹配支持。在本例中,通过flags参数将GASNET_ BARRIERFLAG_ANONYMOUS常量传递给同步函数。任何数值都能以id参数传递(一般为0),因此可以忽略。 - 命名屏障
充分使用id逻辑匹配时最简单的情况是所有调用者间具有相等整型参数的阻塞(与分阶段相反)屏障。
GASNet的分阶段屏障存在一些不太明显的使用限制。为了简化叙述,这里将成功的“try”等价于“wait”操作。第一个限制最为直观,即必须在“notify”与“wait”之间交替使用以确保屏障操作不会相互重叠。第二个限制是在GASNET_PARSYNC或GASNET_PAR编译中,“notify”和“wait”操作在每个节点上只执行一次(客户端可以自由选择执行的线程,且不必为两个阶段选择同一线程)。第三个限制是前两个限制潜在的可能产生的后果:在GASNET_PAR编译时,客户端必须保证在任何时刻都至多有一个客户端线程处于屏障过程中。
时间: 2024-09-26 19:27:13