可能MPI_SEND使用我的输入数据数组作为缓冲区吗?

时间:2014-08-22 03:22:30

标签: mpi

正如我们所知,在发送操作期间有一个叫做MPI发送缓冲区的东西。 以下代码:

MPI_Isend(data, ..., req);
...
MPI_Wait(req, &status)

dataMPI_Isend之间使用MPI_Wait是否安全?

这意味着,MPI_Isend会使用data作为内部发送缓冲区吗?

此外,如果我不再使用data,我是否可以指示MPI使用data作为发送缓冲区,而不是浪费时间来复制data

顺便说一句,我听说过MPI_Bsend,但我不认为在这种情况下可以节省内存和时间。

2 个答案:

答案 0 :(得分:2)

dataMPI_Isend之间使用MPI_Wait绝对不能保存。 在MPI_IsendMPI_Wait之间,您实际上并不知道何时data可以重复使用。只有在MPI_Wait之后,您才能确定已发送data并且您可以重复使用它。 如果您不再使用data,则应在程序结束时致电MPI_Wait

答案 1 :(得分:2)

MPI提供两种操作:阻止非阻止。两者之间的区别在于重用传递给MPI函数的数据缓冲区是安全的。

MPI_Send之类的阻止调用返回时,MPI库不再需要缓冲区,可以安全地重复使用。另一方面,非阻塞调用仅启动相应的操作并让它以异步方式继续。只有成功调用MPI_Wait之类的例程或MPI_Test之后的测试结果之后,才能安全地重用缓冲区。

关于库如何利用用户缓冲区,这是非常特定于实现的。出于性能原因,通常将较短的消息复制到内部(对于MPI库)缓冲区。较长的消息通常直接从用户缓冲区读取并发送到网络,因此MPI正在使用缓冲区,直到整个消息被发送为止。