我想使用异步通信来加速我的 MPI 程序。但使用时间保持不变。工作流程如下。
before:
1. MPI_send/ MPI_recv Halo (ca. 10 Seconds)
2. process the whole Array (ca. 12 Seconds)
after:
1. MPI_Isend/ MPI_Irecv Halo (ca. 0,1 Seconds)
2. process the Array (without Halo) (ca. 10 Seconds)
3. MPI_Wait (ca. 10 Seconds) (should be ca. 0 Seconds)
4. process the Halo only (ca. 2 Seconds)
测量结果表明,对于常见的工作负载,Array-core 的通信和处理时间几乎相同。所以异步应该几乎隐藏了通信时间。但事实并非如此。
一个事实——我认为这可能是问题所在——是 sendbuffer 也是进行计算的数组。尽管通信仅访问 Halo(使用派生数据类型)并且计算仅访问数组的核心(仅读取),但 MPI 是否有可能序列化内存访问?
有人知道这是否肯定是原因吗?
是否可能依赖于实现(我正在使用 OpenMPI)?
提前致谢。