3.7.2 同步数组和工作数组
集合函数需要对称同步数组(及归约操作的对称工作数组),对特定的操作和使用的PE子集设置合适的大小并初始化。这些数组代表全局状态,每个数组的对称成分应该按照一个整体来处理。当对同步数组或工作数组进行访问时,上述描述应该被理解为引用所有PE上该数组对称镜像的整个集合。对同步和工作数组有几个重要的点需要注意。
- 初始化:程序要确保同步数组的分配和初始化及工作数组的分配在集合操作开始使用它们之前在所有PE上完成,这可以通过使用静态分配的数组或在动态分配后使用全局同步屏障来执行。一般所有这些数组都在临近程序启动时分配,因此最多只需要一个全局同步屏障。
排他性:一旦一个集合操作开始,程序必须在所有PE完成操作前保护操作的同步或工作数组免于被其他活动修改(如内存操作、RMA、其他集合操作)。这意味着这些数组不能立即被后续的集合操作重用。 - 完成时取值:一旦所有PE完成,同步或工作数组返回到可以被重用的状态。
- 保护重用:为保护同步或工作数组在一系列集合操作中重用,程序可能需要在重用同步或工作数组之前加全局同步屏障(不好),或在两个同步或工作数组之间轮换(更好)。
- 重用需要相同的PE集:当且仅当参与操作的PE子集保持不变,即开始PE、参与PE数和 log2(PE_跨步)都相同,同类型(屏障、广播、收集、归约)的连续操作不需要对重用的同步数组进行初始化。如果工作数组对某个操作尺寸合适(元素的数目和类型)也可以被重用。