有些情况下,有模糊的含义很多MPI的教程,如“应用程序缓冲区”和“系统缓冲区”的一些条款。 我不明白它们之间的区别。 我也想知道它们位于何处? 我认为应用缓冲器是接收或发送节点内的存储器中。 所以,如果是,什么是系统缓存?
Answer 1:
在MPI的上下文中, 应用缓冲液 (通常称为用户缓冲器 )是包含要发送的信息或其中的信息是要被接收的地方的缓冲区。 应用缓冲区是什么人传递到MPI通信调用,如
MPI_Send(buf, len, type, ...);
// ^^^
// app. buffer
一旦MPI_Send
被调用,消息被构造并根据各种标准经由互连,这可以是任何种类的连接机构的任一发送,例如InfiniBand的,因特网套接字,共享存储器等,并且实际的传输可能会涉及许多中间步骤,或供以后递送内部缓冲。 内部缓冲器 (也系统缓冲器 )是的一部分,并管理由MPI运行时系统和是不可见的应用程序代码。 这不一定是系统缓冲区在内核中的应用空间之外分配或其他地方的情况。 相反,许多MPI实现和互连这些缓冲区在程序地址空间的分配和对程序存储器的使用计数。
另外,也可以利用显式地分配中间缓冲器与MPI_Bsend
呼叫或它的非阻挡变体MPI_Ibsend
。 它要求用户首先分配一个缓冲区,然后通过调用它交给MPI运行MPI_Buffer_attach
。 从这一刻起,这个缓冲区的内容由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, ...);
文章来源: What is difference between Application Buffer and System Buffer