| |
В некоторых системах операции передачи сообщений и удаленный доступ к
памяти (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);
|
Закладки на сайте Проследить за страницей |
Created 1996-2025 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |