gpt4 book ai didi

c - 我是否需要为 MPI::Isend 提供相应的 MPI::Irecv?

转载 作者:太空狗 更新时间:2023-10-29 17:06:23 27 4
gpt4 key购买 nike

一个看似愚蠢的问题,但我似乎无法以任何方式找到明确的答案。

基本问题是我是否需要为 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com