Application Buffer和System Buffer之间有什么区别

时间:2014-11-19 03:19:16

标签: c++ parallel-processing buffer mpi

许多MPI教程中都有一些术语具有模糊含义,例如" Application Buffer"和"系统缓冲区"。我不明白它们之间的区别。我也想知道他们在哪里?我认为应用程序缓冲区是接收或发送节点内的内存。如果是,那么系统缓冲​​区是什么?

1 个答案:

答案 0 :(得分:4)

在MPI的上下文中,应用程序缓冲区(通常称为用户缓冲区)是保存要发送的信息或接收信息的位置的缓冲区。应用程序缓冲区是传递给MPI通信调用的缓冲区,例如

MPI_Send(buf, len, type, ...);
//       ^^^
//    app. buffer

一旦调用MPI_Send,就构造一条消息,并根据各种标准通过互连发送,互连可以是任何类型的连接机制,例如InfiniBand,Internet套接字,共享内存等。实际传输可能涉及许多中间步骤,或内部缓冲以供以后传送。 内部缓冲区(也是系统缓冲区)是MPI运行时系统的一部分并由其管理,对应用程序代码是不可见的。系统缓冲区不一定在内核中或应用程序空间外的其他位置分配。相反,对于许多MPI实现和互连,这些缓冲区在程序地址空间中分配,并计入程序内存使用量。

也可以利用MPI_Bsend调用或其非阻塞变体MPI_Ibsend明确分配中间缓冲区。它要求用户首先分配一个缓冲区,然后通过调用MPI_Buffer_attach将其提供给MPI运行时。从那一刻开始,此缓冲区的内容仅由MPI运行时系统管理。

应用程序和系统缓冲区之间的区别对于操作完成的概念很重要。当MPI不再需要访问应用程序缓冲区时,MPI操作被认为是完整的。例如:

buf[] = some content;
MPI_Send(buf, len, ...);
// once MPI_Send returns, the buffer can be reused
buf[0] = 1;
MPI_Send(buf, 1, ...);

使用非阻塞调用,操作在后台继续,并且必须注意在异步操作完成之前不要修改应用程序缓冲区:

MPI_Request req;
buf[] = some content;
MPI_Isend(buf, len, ...,  &req);
buf[0] = 1;                  // DATA RACE: buf might still be in use by
MPI_Send(buf, 1, ...);       // the operation initiated by MPI_Isend

在这种情况下正确使用buf将类似于:

MPI_Request req;
buf[] = some content;
MPI_Isend(buf, len, ...,  &req);
// Do something that does not involve changing buf
// ...
// ...
// Make sure the operation is complete before continuing
MPI_Wait(&req, MPI_STATUS_IGNORE);
// buf is now free for reuse
buf[0] = 1;
MPI_Send(buf, 1, ...);