- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
一个看似愚蠢的问题,但我似乎无法以任何方式找到明确的答案。
基本问题是我是否需要为 MPI::Isend 提供相应的 MPI::Irecv?
也就是说,即使消息发送是非阻塞的,只要我在重用发送缓冲区之前等待发送完成,我是否需要使用非阻塞接收和等待来接收发送的缓冲区?
我的观点是,我想在发送消息时使用非阻塞发送来“做其他事情”,但接收进程将立即使用缓冲区,所以我希望它们阻塞直到真正接收到缓冲区。
似乎我应该能够使用 MPI::Recv 接收消息,即使它们是使用 MPI::Isend 发送的,但我想知道我是否遗漏了什么?
一些简单的伪代码
if( rank == 0 ){
int r;
for ( int i = 0; i < n; i++ ){
// DO SOME STUFF HERE...
request.Wait(status);
request2.Wait(status);
request3.Wait(status);
r = i;
memcpy( key, fromKey(i), ...);
memcpy( trace, fromTrace(i), ...);
request = MPI::COMM_WORLD.Isend( &r, 1, MPI::INT, node, tag );
request2 = MPI::COMM_WORLD.Isend( key, 10, MPI::INT, node, tag );
request3 = MPI::COMM_WORLD.Isend( trace, nBytesTotal, MPI::BYTE, node, tag );
// DO SOME MORE STUFF HERE.
}
r = -1;
request = MPI::COMM_WORLD.Isend( &r, 1, MPI::INT, node, tag );
// Carry on ...
} else {
int r = -1;
MPI::COMM_WORLD.Recv( &r, 1, MPI::INT, 0, tag, status );
while( r >= 0 ){
MPI::COMM_WORLD.Recv( &key, 10, MPI::INT, 0, tag, status );
memcpy( saveKey, key, ...);
MPI::COMM_WORLD.Recv( &trace, nBytesTotal, MPI::BYTE, 0, tag, status );
memcpy( saveTrace, trace, ...);
MPI::COMM_WORLD.Recv( &r, 1, MPI::INT, 0, tag, status );
}
最佳答案
不,您可以在通信的两端自由混合阻塞和非阻塞 MPI 操作。阻塞与 MPI 调用何时将控制权返回给您的代码有关,而不是与正在传输的消息的内容有关。
每个 MPI 消息都带有一个“信封”,其中包含其源、目标、标记和通信器。要成功接收消息,您的接收操作应该只匹配它的信封。信封绝不会指定消息的发送方式——是通过阻塞发送的,还是通过非阻塞操作发送的,是同步发送 (MPI_Ssend
) 还是缓冲发送 (MPI_Bsend
).唯一的异常(exception)是所谓的“就绪模式”发送,它由 MPI_Rsend()
或 MPI_Irsend()
启动,它要求匹配的接收操作已经发布或消息将不会被传送。
这就是为什么在整个 MPI 标准中使用术语“匹配接收操作”而不是“相应的接收函数”之类的术语。
关于c - 我是否需要为 MPI::Isend 提供相应的 MPI::Irecv?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10656350/
我正在运行以下代码,该代码使用命令 rank 将数组从 0 1 发送到 mpirun -n 2 python -u test_irecv.py > output 2>&1 。 from mpi4py
我使用MPI非阻塞通信(MPI_Irecv, MP_Isend)来监控slaves的空闲状态,代码如下。 排名 0: int dest = -1; while( dest <= 0){ int
我正在创建一个程序,其中来自数组的信息被传递到不同的处理器。在下面的代码中,我尝试使用 for 循环反复向处理器发送信息或从处理器发送信息。当我在 5 核和 2 核上运行程序时,所有打印语句都按预期在
我正在收到 boost::mpi使用 irecv() 的消息功能。我有一个等待循环,调用 test()在 request 上irecv 返回的对象并且,如果请求完成,则执行某些操作。然而,试图找出发件
我的 MPI_Isend 和 MPI_Irecv 代码块有问题。我需要将一个数字 Cin 发送到生产线上的下一个流程,然后当前流程才能处理它的业务。 接收进程需要接收才能继续计算,但是当我没有 MPI
我在 c 中有一个简单的 MPI 代码,我试图在其中学习如何在进程之间进行通信。这是代码: 已编辑代码 -> 问题已解决 #include #include #include #include
一个看似愚蠢的问题,但我似乎无法以任何方式找到明确的答案。 基本问题是我是否需要为 MPI::Isend 提供相应的 MPI::Irecv? 也就是说,即使消息发送是非阻塞的,只要我在重用发送缓冲区之
当我使用 Send/Recv 时,我的代码可以工作,但是当我用 Isend/Irecv 替换 Send/Recv 时,它会产生段错误。但在去其他地方之前,我想验证一下以下代码片段是否看起来很重要。 其
当使用序列化数据对同一标签执行多个 isend/irecv 传输时,我发现 boost::mpi 出现了 MPI_ERR_TRUNCATE 错误。这些不是并发传输,即不涉及线程。同时只有不止一项未完成
我正在尝试并行生成导数矩阵。我有两个线程的整个热方程求解器,但现在我试图找出如何将底行发送到下一个级别的 rec2,并将顶行发送到上一个级别的 rec1。我试着弄乱请求矩阵中的数字,但没有任何效果。出
我正在创建一个程序来使用 MPI 计算两个导体之间的电势。我正在使用非阻塞发送和接收,因此可以在处理器之间发送信息时进行计算。 但是,isend 和 irecv 之间的 if 语句以及包含计算的 wa
我是一名优秀的程序员,十分优秀!