首页 > 解决方案 > 如何确保 MPI 异步调用并行执行?

问题描述

我有一个正在尝试加速的程序,但我不确定 MPI 异步通信的行为是否符合我的预期。我希望创建一个线程来执行通信,而原始线程可以继续并行计算。如何确保程序以这种方式执行?

基本程序发出包含未来数据的迭代价值的Allgather每一次迭代。任何迭代都只使用迭代前产生的数据。我的想法是,与其将数据的迭代批处理成一个阻塞(基本程序已经这样做),我可以在每次迭代后发出一个异步,然后检查数据是否从现在开始迭代。该程序的计算量约为 90%,因此我认为这为隐藏通信延迟提供了充足的机会。不幸的是,该程序现在比我开始使用它之前要慢得多。系统的消息传递延迟远小于为这种大小的消息执行代码迭代所需的时间。xxxAllgatherIallgatherxx

我修改了我的代码以尝试调试一下。我对可能导致问题的原因有两个想法:

  1. 由于某种原因,异步通信速度较慢
  2. 通信和计算没有并行执行

为了测试(1),我把所有的Iallgathers 都变成Allgather了 s——结果是一样的。这让我相信我Iallgather的 s 没有同时进行。

为了测试(2),我完全不确定我做对了。我认为调用MPI_Wait(&my_handle, ...)可能会强制调用线程进行传输,所以我做了这样的事情。

MPI_Iallgather(send_data, send_data_size, ..., &handle);
#pragma omp task
{
    MPI_Wait(&handle, MPI_STATUS_IGNORE);
}

这可能是错误的方法,也许是发出的线程Iallgather必须执行它。

总之:我希望Iallgather在并行执行或任何异步通信调用时继续计算。如何确保按预期执行这些操作?是否有可能并行执行并且性能很垃圾?我希望在切换IallgatherAllgather我的代码时至少会看到执行时间的差异。

我意识到这个问题的一些答案可能依赖于实现,所以我使用的是 openMPI 5.0.0a1。

标签: c++multithreadingasynchronousmpi

解决方案


推荐阅读