2014-11-19 4 views
0

Во многих учебниках MPI есть несколько терминов, которые имеют неопределенное значение, например «Буфер приложений» и «Системный буфер». Я не понимаю разницы между ними. Я также задаюсь вопросом, где они расположены? Я думаю, что буфер приложения - это память внутри принимающего или отправляющего узла. Так что, если это так, что такое системный буфер?В чем разница между буфером приложений и системным буфером

ответ

3

В контексте 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, ...); 
Смежные вопросы