MPI_Isend/Irecv:是否可以同时访问未使用内存位置上的sendbuffer

MPI_Isend/Irecv:是否可以同时访问未使用内存位置上的sendbuffer,mpi,memory-access,Mpi,Memory Access,我想使用异步通信来加速我的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

我想使用异步通信来加速我的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)
测量结果表明,对于常见的工作负载,阵列核心的通信和处理几乎需要相同的时间。因此异步应该几乎隐藏通信时间。 但事实并非如此

一个事实——我认为这可能是问题所在——是sendbuffer也是进行计算的数组。尽管通信仅访问Halo(使用派生数据类型),而计算仅访问阵列的核心(仅读取),但MPI是否可能序列化内存访问

有人知道这是不是确实的原因吗

它是否可能依赖于实现(我正在使用OpenMPI)

提前感谢。

各州:

非阻塞发送调用表示系统可能开始复制 将数据从发送缓冲区中取出。发件人不应修改邮件的任何部分 在调用非阻塞发送操作后发送缓冲区,直到 发送完成

因此,是的,您应该首先将数据复制到专用的发送缓冲区。

状态:

非阻塞发送调用表示系统可能开始复制 将数据从发送缓冲区中取出。发件人不应修改邮件的任何部分 在调用非阻塞发送操作后发送缓冲区,直到 发送完成


因此,是的,您应该首先将数据复制到专用的发送缓冲区。

这不是MPI在用户代码中序列化内存访问的情况(一般来说,这超出了库的能力),而且确实发生的事情是特定于实现的

但实际上,MPI库并不像您希望的那样在“后台”进行大量通信,在使用tcp+以太网等传输和网络时尤其如此,因为在这种情况下,没有任何有意义的方式将通信转移到另一组硬件

只有在运行MPI库代码时(例如在MPI函数调用中),才能确保MPI库确实在执行某些操作。通常,对多个MPI调用中的任何一个调用都会推动实现“进度引擎”,该引擎跟踪飞行中的消息并引导它们前进。因此,例如,您可以快速做的一件事是对计算循环中的请求调用MPI_Test(),以确保在MPI_Wait()之前事情开始正常进行。当然,这是有开销的,但这是很容易衡量的

当然,您可以想象MPI库会使用其他机制在后台运行。MPICH2和OpenMPI都使用单独的“进程线程”,这些线程与用户代码分开执行,并在后台进行引导;但是,要让它正常工作,并且在您尝试运行计算时不占用处理器,是一个真正困难的问题。OpenMPI的ProgressThreads实现长期以来一直是实验性的,事实上暂时退出了当前(1.6.x)版本,尽管工作仍在继续。我不确定MPICH2是否支持

如果您使用的是infiniband,因为它的网络硬件具有很多智能,那么前景会有点光明。如果您愿意保持内存固定(对于openfabrics),和/或您可以使用特定于供应商的模块(mxm用于Mellanox,psm用于Qlogic),那么事情可以进展得更快一些。如果您使用的是共享内存,则还可以帮助进行内部模式传输


如果内存不是一个大问题,您还可以采取另一种特定于实现的方法,即尝试直接发送数据,或者每个数据块发送更多数据,从而减少对进度引擎的轻推。急切协议在这里的意思是,数据在发送时自动发送,而不仅仅是启动一组握手,最终导致消息被发送。坏消息是,这通常需要为库提供额外的缓冲内存,但是如果这不是问题,并且您知道传入消息的数量是有界的(例如,由您拥有的halo邻居的数量),那么这会有很大帮助。有关如何为openmpi的(例如)共享内存传输执行此操作的说明,但其他传输和其他实现中也存在类似的参数。一个很好的工具是“mpitune”工具,它可以自动运行许多这样的参数以获得最佳性能。

MPI并不是在用户代码中序列化内存访问(一般来说,这超出了库的能力),确实,实际发生的情况是特定于实现的

但实际上,MPI库并不像您希望的那样在“后台”进行大量通信,在使用tcp+以太网等传输和网络时尤其如此,因为在这种情况下,没有任何有意义的方式将通信转移到另一组硬件

只有在运行MPI库代码时(例如在MPI函数调用中),才能确保MPI库确实在执行某些操作。通常,对多个MPI调用中的任何一个调用都会推动实现“进度引擎”,该引擎跟踪飞行中的消息并引导它们前进。因此,例如,您可以快速做的一件事是对计算循环中的请求调用MPI_Test(),以确保在MPI_Wait()之前事情开始正常进行。当然,这是有开销的,但这是很容易衡量的

当然,您可以想象MPI库会使用其他机制在后台运行。MPICH2和OpenMPI都使用单独的“进程线程”,这些线程与用户代码分开执行,并在后台进行引导;但是通用电气