3.7.6 归约
归约函数对参与PE的对称源的每个相应元素执行原生操作,再将操作结果放入每个参与PE对称目标的相应元素(例如查找参与PE源数组第一个元素的最大值,并将最大值放置在每个参与PE目标数组的第一个元素,对源数组的剩余元素以此类推)。对大部分非字节类型都有归约操作的变体,包括short、int、long、long long、float和double。这些变体实现了几个原生操作:按位AND、按位OR、按位XOR、原生型SUM和原生型PRODUCT。不同的归约函数根据操作数的类型和实现的操作符来命名。和其他集合函数相同,归约函数允许程序员通过指定开始PE、log2(PE跨步)、参与PE的数目来选择参与的PE子集。长度为_SHMEM_REDUCE_SYNC_SIZE的对称同步数组是必需的,且该数组要在被所有PE使用前初始化为_SHMEM_SYNC_VALUE(也同样需要全局屏障)。归约操作也需要足够大的工作数组能容纳max(nreduce/2+1,_SHMEM_REDUCE_MIN_ WRKDATA_SIZE)个被归约元素。
然而如前文所述,可以使用两个同步或工作数组对,一旦执行初始化后的全局同步,程序可简单地在两个同步或工作数组对之间轮换,而不是在每个归约前加同步屏障。如果每次同步数组使用时PE主动集相同,同步数组可以在随后轮换的归约中使用(不需要重新初始化)。工作数组也能在相同的条件下使用,只要元素数目不超过最初的分配。代码清单3-20展示了求和归约函数的使用。两个同步或工作数组对允许通过轮换使用的数组对背靠背地调用归约函数以控制操作。每个集合操作完成时,每个PE的目标数组都包含每个PE上源数组相应元素的和。