我正在用MPI编程。我希望将一些东西发送到另一个处理器并在那里接收,但我不知道我会发送多少信息。实际上,发送到其他处理器的消息数量取决于我在程序中读取的文件,因此我不知道在另一侧应该写多少个接收函数。我应该使用哪种方法和哪个函数呢?
if (sender) {
while (data_to_send == true) {
MPI_Send(data, size, datatype, receiving_rank, 0, MPI_COMM_WORLD);
}
for (i = 0; i < size; i++) {
MPI_Send(NULL, 0, MPI_INT, i, 1, MPI_COMM_WORLD);
}
} else {
while (1) {
MPI_Recv(data, size, datatype, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
if (status.MPI_TAG == 1) break;
/* Do processing */
}
}
如果您有非阻塞集合(来自MPI-3),那么有一种更好的方法可行。在开始接收数据之前,您可以发布一个非阻塞障碍。然后您开始发布非阻塞接收。而不是仅等待接收,您使用waitany在两个请求上等待,当障碍完成时,您知道不会再有更多数据了。在发送方面,您只需持续发送数据,直到没有更多数据为止,然后进行非阻塞障碍以完成操作。