Реализация диалекта shmem-экспресс на традиционном вычислительном кластере

В программах, написанных с использованием MPI, можно пользоваться подмножеством функций shmem-экспресс. На МВС-Экспресс для этого требуется выбрать версию Intel MPI + CUDA. Программа должна включать (после mpi.h) файл заголовков shmem_mpi.h, расположенный в /usr/local/shmem/include. Вместе с программой следует принудительно компоновать объектный модуль shmem_mpi.o, расположенный в /usr/local/shmem/lib. Команда трансляции таких программ делает все это, называется shmemcc и находится в /usr/local/shmem/bin.

Инициализировать и завершать работу программы можно как в стиле MPI (MPI_Init()), так и в стиле shmem (shmem_init()), но только один раз: вызвав MPI_Init(), shmem_init() вызывать уже не нужно, и наоборот. Барьеры в MPI и shmem разные: MPI_Barrier() не выполняет функций барьера для shmem, shmem_barrier_all() не выполняет функций барьера для MPI. Сочетать в одной программе обращения к функциям MPI и к функциям подмножества shmem-экспресс можно без ограничений.

В настоящее время реализовано ограниченное подмножество функций shmem-экспресс. Не реализованы:

  • shmem_barrier_alloc()
  • shmem_barrier()
  • shmem_coarray()

а также функции чтения (shmem…get()) и атомарного приращения (shmem…add()).

В /usr/local/shmem/example находится пример использования описанных возможностей. Решается задача Дирихле на прямоугольной сетке, искусственно представленной в программе как неструктурная. Программа не является корректным примером расчета на неструктурной сетке, поскольку при вычислении по пятиточечному шаблону ячейка предполагается всегда квадратной, чего на неструктурной сетке быть не может. Целью написания этого примера является только демонстрация техники параллельной реализации работы с неструктурными сетками при помощи shmem.

В файле Unstr.doc находится прокомментированный текст однопроцессорного прототипа этой программы, разработанный А. Б. Карагичевым.

Описанная здесь модифицированная версия MPI предоставляет пользователю еще одну полезную возможность, даже если пользователь вообще не обращается к функциям shmem.

Хорошо известно, что программы с использованием MPI можно сделать значительно более эффективными, если предусмотреть в них совмещение во времени обменов данными со счетом. Реализация этой возможности связана с использованием таких функций MPI, как MPI_Isend()/Irecv() и/или MPI_Start()/Startall().  Обращение к одной из этих функций запускает обмен данными, после чего возвращает управление вызвавшей программе, не дожидаясь завершения запущенного обмена. Программа может что-то вычислять, пока обмен идет, а затем подождать завершения обмена при помощи MPI_Wait()/Waitall(). Полученная таким образом экономия на накладных расходах может быть очень заметной, но лишь при одном условии. Необходимо, чтобы используемая реализация MPI действительно, физически запускала обмен, а не просто запоминала запрос на него, откладывая его реальное выполнение до обращения к MPI_Wait()/Waitall(). Стандарт не запрещает реализации MPI поступать именно таким, «неправильным» способом, что сводит на нет все усилия пользователя по совмещению обменов со счетом во времени. В большинстве распространенных реализаций MPI обмены физически совмещаются со счетом во времени только для сообщений, длина которых меньше некоторого порогового значения (которое у каждой версии свое). Предлагаемая версия MPI с поддержкой shmem-экспресс исправляет «неправильное» поведение MPI в части совмещения обменов со счетом, делая экономию на этом совмещении реальной при любой длине пересылаемых сообщений.

 
 
 
 
 
 
 
 
  Тел. +7(499)220-79-72; E-mail: inform@kiam.ru