3.7.5 收集
集合函数执行聚集收集,将元素块从每个参与PE的对称源对象拷贝,并连续复制到参与集合操作的每个PE上的(更大的)对称目标数组,程序员必须确保对称目标数组足够大以便接收聚集的数据。对32和64位的数据类型都有收集函数,且对每种都有两个收集函数变体:一般的collect允许每个PE贡献不同数目的元素,固定大小的fcollect需要每个PE贡献相同数目的元素。和其他集合函数相同,收集函数允许程序员通过指定开始PE、log2(PE跨步)、参与PE的数目来选择参与的PE子集,以及长度为_SHMEM_COLLECT_SYNC_SIZE的对称同步数组,该数组必须在被所有PE使用前初始化为预定值_SHMEM_SYNC_VALUE,因此需要在初始化和使用之间同步,例如全局同步屏障。但如前所述,可以使用两个同步数组,一旦执行初始化后的全局同步,程序可简单地在两个同步数组之间轮换,而不是在每个收集前加同步屏障。如果每次同步数组使用的PE主动集相同,同步数组可以在随后轮换的收集中使用(不需要重新初始化)。代码清单3-18展示了一般的收集函数。两个同步数组允许通过轮换使用的同步数组背靠背地调用收集函数以控制集合操作。每个集合操作完成时,每个PE的目标数组都包括集合中每个参与者提供的数据块序列。