next up previous contents
Next: Способность языка к взаимодействию Up: Разное Previous: Объект Info   Contents

Распределение памяти

В некоторых системах операции передачи сообщений и удаленный доступ к памяти (RMA) выполняются быстрее при доступе к специально распределенной памяти (например, память, которая разделена другими процессами в группе связи на SMP). MPI обеспечивает механизм для распределения и освобождения такой специальной памяти. Использование такой памяти для передачи сообщений или RMA не обязательно, и эта память может использоваться без ограничений, как любая другая динамически распределенная память. Однако, реализации могут ограничить использование функций MPI_WIN_LOCK и MPI_WIN_UNLOCK к окнам, распределенным в такой памяти (см. Раздел 6.4.3.)

MPI_ALLOC_MEM(size, info, baseptr)

IN size размер сегмента памяти в байтах (неотрицательное целое число)  
IN info аргумент информации (указатель)  
OUT baseptr указатель на начало распределенного сегмента памяти  

int MPI_Alloc_mem(MPI_Aint size, MPI_Info info, void *baseptr) MPI_ALLOC_MEM(SIZE, INFO, BASEPTR, IERROR) INTEGER INFO, IERROR INTEGER(KIND=MPI_ADDRESS_KIND) SIZE, BASEPTR void* MPI::Alloc_mem(MPI::Aint size, const MPI::Info& info)

Аргумент info может использоваться, чтобы обеспечить директивы, которые управляют желательным расположением распределенной памяти. Такая директива не затрагивает семантику вызова. Действительные значения аргумента info зависят от реализации; нулевое директивное значение info=MPI_INFO_NULL всегда действительно.

Функция MPI_ALLOC_MEM может возвращать код ошибки класса MPI_ERR_NO_MEM, чтобы указать, что она потерпела неудачу, потому что не хватает памяти.

MPI_FREE_MEM(base)

IN base начальный адрес сегмента памяти, распределенного MPI_ALLOC_MEM  

int MPI_Free_mem(void *base) MPI_FREE_MEM (BASE, IERROR) <type> BASE(*) INTEGER IERROR void MPI::Free_mem(void *base)

Функция MPI_FREE_MEM может возвратить код ошибки класса MPI_ERR_BASE, чтобы указать недействительный основной аргумент.

Объяснение: Привязки Си и С++ MPI_ALLOC_MEM и MPI_FREE_MEM подобны привязкам для вызовов malloc и free из библиотек Си: вызов MPI_Alloc_mem(..., &base) должен быть парным вызову MPI_Free_mem(base) (еще один уровень косвенности). Оба аргумента объявлены того же самого типа void*, чтобы облегчить приведение типа. Привязка ФОРТРАН совместима с привязками С++ и Си: Вызов MPI_ALLOC_MEM языка ФОРТРАН возвращает в baseptr (оцененное целое число) адрес распределенной памяти. Аргумент base функции MPI_FREE_MEM - аргумент выбора, который передает (ссылается на) переменную, сохраненную в том расположении. []

Совет разработчикам: Если MPI_ALLOC_MEM распределяет специальную память, то должно использоваться оформление, подобное оформлению функций Си malloc и free, чтобы выяснить размер сегмента памяти, когда сегмент освобожден. Если никакая специальная память не используется, MPI_ALLOC_MEM просто вызывает malloc, и MPI_FREE_MEM вызывает free.

Вызов MPI_ALLOC_MEM может использоваться в разделяемых системах памяти, чтобы распределить память в разделяемом сегменте памяти. []

Пример 4.7 Пример использования MPI_ALLOC_MEM в языке ФОРТРАН с поддержкой указателя. Мы принимаем 4-байтовые REAL, и предполагаем, что указатели являются адрес-размерными.

REAL A POINTER (P, A(100,100)) ! память не распределена CALL MPI_ALLOC_MEM(4*100*100, MPI_INFO_NULL, P, IERR) ! память распределена ... A(3,5) = 2.71; ... CALL MPI_FREE_MEM(A, IERR) ! память освобождена

Так как стандартный ФОРТРАН не поддерживает указатели (Си-подобные), этот код - не код ФОРТРАН90 или ФОРТРАН77. Некоторые компиляторы (в частности, во время создания документа, g77 и компиляторы языка ФОРТРАН для Intel) не поддерживают этот код.

Пример 4.8 Тот же самый пример в Си:

float (* f)[100][100] ; MPI_Alloc_mem(sizeof(float)*100*100, MPI_INFO_NULL, &f); (*f)[5][3] = 2.71; ... MPI_Free_mem(f);



Alex Otwagin 2002-12-10