我正在尝试ISend()
两个数组:arr1,arr2
和一个n
大小为的整数arr1,arr2
.我从这篇文章中了解到发送包含所有三个结构的结构不是一个选项,因为n
只在运行时才知道.显然,我需要n
先接收,否则接收过程将不知道要接收多少元素.在不使用blokcing的情况下实现这一目标的最有效方法是什么Send()
?
发送数组的大小是冗余的(并且效率低下),因为MPI提供了一种探测传入消息而不接收它们的方法,它提供了足够的信息以便正确分配内存.使用MPI_PROBE
看起来很像的探测MPI_RECV
,除了它不需要与缓冲区相关的参数.探测操作返回一个状态对象,然后可以查询可以从消息内容中提取的给定MPI数据类型MPI_GET_COUNT
的元素数量,因此显式发送元素数量变得多余.
这是一个有两个等级的简单示例:
if (rank == 0)
{
MPI_Request req;
// Send a message to rank 1
MPI_Isend(arr1, n, MPI_DOUBLE, 1, 0, MPI_COMM_WORLD, &req);
// Do not forget to complete the request!
MPI_Wait(&req, MPI_STATUS_IGNORE);
}
else if (rank == 1)
{
MPI_Status status;
// Wait for a message from rank 0 with tag 0
MPI_Probe(0, 0, MPI_COMM_WORLD, &status);
// Find out the number of elements in the message -> size goes to "n"
MPI_Get_count(&status, MPI_DOUBLE, &n);
// Allocate memory
arr1 = malloc(n*sizeof(double));
// Receive the message. ignore the status
MPI_Recv(arr1, n, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
}
Run Code Online (Sandbox Code Playgroud)
MPI_PROBE
还接受通配符等级MPI_ANY_SOURCE
和通配符标记MPI_ANY_TAG
.然后,可以查询状态结构中的相应条目,以便找出实际的发送者等级和实际的消息标记.
探测消息大小的工作原理是每条消息都带有一个标题,称为信封.信封包括发送者的等级,接收者的等级,消息标记和通信者.它还包含有关总消息大小的信息.信封作为两个通信进程之间初始握手的一部分发送.
归档时间: |
|
查看次数: |
5375 次 |
最近记录: |