В некоторых системах операции передачи сообщений и удаленный доступ к
памяти (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);