c++ - 如何确保 MPI 异步调用并行执行?
问题描述
我有一个正在尝试加速的程序,但我不确定 MPI 异步通信的行为是否符合我的预期。我希望创建一个线程来执行通信,而原始线程可以继续并行计算。如何确保程序以这种方式执行?
基本程序发出包含未来数据的迭代价值的Allgather
每一次迭代。任何迭代都只使用迭代前产生的数据。我的想法是,与其将数据的迭代批处理成一个阻塞(基本程序已经这样做),我可以在每次迭代后发出一个异步,然后检查数据是否从现在开始迭代。该程序的计算量约为 90%,因此我认为这为隐藏通信延迟提供了充足的机会。不幸的是,该程序现在比我开始使用它之前要慢得多。系统的消息传递延迟远小于为这种大小的消息执行代码迭代所需的时间。x
x
x
Allgather
Iallgather
x
x
我修改了我的代码以尝试调试一下。我对可能导致问题的原因有两个想法:
- 由于某种原因,异步通信速度较慢
- 通信和计算没有并行执行
为了测试(1),我把所有的Iallgather
s 都变成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
在并行执行或任何异步通信调用时继续计算。如何确保按预期执行这些操作?是否有可能并行执行并且性能很垃圾?我希望在切换Iallgather
到Allgather
我的代码时至少会看到执行时间的差异。
我意识到这个问题的一些答案可能依赖于实现,所以我使用的是 openMPI 5.0.0a1。
解决方案
推荐阅读
- excel - 排序表不包括第一行
- php - 在 PHP 中将本地假期添加到日期/时间计算
- c++ - 派生类销毁的最佳实践是什么?
- reactjs - 将 Truepush 初始化代码添加到 Gatsby
- reactjs - 如何使用 React 将嵌套数组添加到 Firestore 数据库中?
- laravel - laravel:数据表不显示任何数据
- azure - Azure App Service Deploy,如何设置 docker ENV 变量
- javascript - 尝试拆分以下网址
- amazon-web-services - AWS:每小时将数据从 DyanmoDB 同步到 Redshift
- flutter - 颤振中找不到文件问题