3.6.2 fence和quiet:RMA操作排序
当同步屏障创建重量级同步时,fence和quiet要更加轻量级(因此可扩展性更好),但提供的同步保证也更弱。fence仅确保来自单一主动PE操作的前后顺序,并被一个单独的被动PE所见。在代码清单3-10的例子中,fence被用在put和get之间以确保put的结果能在get之前可见,在这种情况下用fence就足够了,因为RMA仅包括这个PE和它的继承者。本质上,当fence函数在两组RMA操作之间被调用时,所提供的保障如下:
fence语义:对来自一个特定主动PE到一个特定被动PE的一系列传输,如果主动PE调用fence函数,则在被动端可以保证所有在fence之前由主动PE发起的操作都能在fence之后发起的传输可见之前在被动端可见。
当所有PE都主动发起传输、被动参与传输并调用fence函数时,成对的排序保证可能不足以确保内存更新正确的顺序。如果需要全局前后顺序,应该使用quiet函数。在代码清单3-11展示的例子中,每个PE用put更新了其继承者上的一个值,然后用get更新其前任的一个值,这种情况下成对排序就不够了,要用quiet保证全局排序。
fence仅对fence前后的操作强加成对的排序,quiet对在其前后的RMA操作施加更强的(也更高开销的)全局排序。但是quiet仍比同步屏障要好得多,因为它只对每个PE的到达操作进行排序而不指定PE之间的同步。
quiet语义:对在主动PE和被动PE之间的一些列传输,调用quiet函数能确保所有在quiet之前发起的RMA操作都能在所有quiet之后发起的RMA操作可见之前被全局可见。