The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Каталог документации / Раздел "Программирование, языки" / Оглавление документа
next up previous contents
Next: Конструктор типа ''субмассив'' Up: Примеры Previous: Примеры   Contents

Двойная буферизация при коллективном вводе-выводе

Этот пример иллюстрирует как перекрывать расчеты и вывод. Расчеты производятся функцией compute_buffer().

/*===============================================================
 *
 * Функция:            double_buffer
 *
 * Определение:
 *      void double_buffer(
 *              MPI_File fh,                            ** IN
 *              MPI_Datatype buftype,                   ** IN
 *              int bufcount                            ** IN
 *      )
 *
 * Описание:
 *      Перекрывает расчеты и коллективную запись используя
 *      технику двойной буферизации.
 *
 * Параметры:
 *      fh                 дескриптор открытого файла MPI
 *      buftype            тип данных MPI для размещения в памяти
 *                         (Предполагает, что для fh установлен
 *                          совместимое отображение)
 *      bufcount           # элементы типа buftype для передачи
 *-------------------------------------------------------------*/

/* это макро переключает используемый буфер "x" */
#define TOGGLE_PTR(x) (((x)==(buffer1))?(x=buffer2):(x=buffer1))

void double_buffer( MPI_File fh, MPI_Datatype buftype,
                    int bufcount)
{

   MPI_Status status;         /* статус вызова MPI */
   float *buffer1, *buffer2;  /* буфер для результатов */
   float *compute_buf_ptr;    /* буфер назначения */
                              /*   для расчетов */
   float *write_buf_ptr;      /* источник для записи */
   int done;                  /* определяет, когда  выходить*/

   /* инициализация буфера */
   buffer1 = (float *)
                      malloc(bufcount*sizeof(float)) ;
   buffer2 = (float *)
                      malloc(bufcount*sizeof(float)) ;
   compute_buf_ptr = buffer1 ;
                        /* изначально указывает на buffer1 */
   write_buf_ptr   = buffer1 ;
                        /* изначально указывает на buffer1 */


   /* пролог DOUBLE-BUFFER:
    *   рассчитать buffer1; затем начать запись на диск buffer1
    */
   compute_buffer(compute_buf_ptr, bufcount, &done);
   MPI_File_write_all_begin(fh, write_buf_ptr,
                            bufcount, buftype);

   /* устойчивое состояние DOUBLE-BUFFER:
    *  перекрываем запись старых результатов из буфера, на
    *  который указывает write_buf_ptr
    *  расчетами новых результатов в буфер, на который указывает
    *  compute_buf_ptr.
    *
    *  В устойчивом состоянии всегда исполузуется один буфер для
    *  расчетов и один для записи.
    */
   while (!done) {
      TOGGLE_PTR(compute_buf_ptr);
      compute_buffer(compute_buf_ptr, bufcount, &done);
      MPI_File_write_all_end(fh, write_buf_ptr, &status);
      TOGGLE_PTR(write_buf_ptr);
      MPI_File_write_all_begin(fh, write_buf_ptr,
                               bufcount, buftype);
   }

   /* эпилог DOUBLE-BUFFER:
    *   ждем завершения последней записи.
    */
   MPI_File_write_all_end(fh, write_buf_ptr, &status);


   /* очищаем буферы */
   free(buffer1);
   free(buffer2);
}



Alex Otwagin 2002-12-10



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру