减少每次通信的固定开销
例如一次 MPI message 可能需要从应用程序,发起 MPI,进行打包/协议处理,通过网络接口,再送进网络。
减少固定 overhead 的方法:
- 发送少量消息,每次发送消息的量变大
- 将很多小消息合并成大消息
降低通信 latency
- 可以通过一些优化方法,让通信/数据访问具有更好的 locality,比如分块。
- 在硬件层面降低通信 latency,比如 NV GPU 核心中的 NVLink。
降低资源竞争
这在多核、多节点中很常见。例如当同时 4 个 core 访问 memory,则会有 4 个 core 同时竞争带宽。
解决方法:
- 复制被竞争的资源到每个节点
- 使用更细粒度的 lock,减少多个执行单元对同一个资源的竞争
- 错开对资源的访问时间,可以通过调度、分批处理、通信安排等方式实现
增加通信/计算 overlap
可以使用异步通信(MPI_Irecv & MPI_Isend),同时硬件也会主动帮忙隐藏 latency,例如 pipeline,多线程,prefetching,乱序执行。
想要隐藏 latency,通常需要比硬件执行单元数量更多的并发工作。