LAMMPS — различия между версиями

Материал из Department of Theoretical and Applied Mechanics
Перейти к: навигация, поиск
(Процесс)
(Реализация параллельного вычисления в пакете LAMMPS по средством MPI на языке Си++)
Строка 1: Строка 1:
===  Реализация параллельного вычисления в пакете LAMMPS  по средством MPI на языке Си++  ===
+
===  Реализация параллельного вычисления в пакете LAMMPS  посредством MPI на языке Си++  ===
  
 
[[Файл:Logo.gif|center|300px]]
 
[[Файл:Logo.gif|center|300px]]

Версия 11:30, 24 апреля 2015

Реализация параллельного вычисления в пакете LAMMPS посредством MPI на языке Си++

В данном разделе хотелось бы осветить, как осуществляется параллелизм в пакете LAMMPS (англ. Large-scale Atomic/Molecular Massively Parallel Simulator). А именно, пакете для классической молекулярной динамики, написанный группой из Сандийских национальных лабораторий. Он может применяться для крупных расчётов (до десятков миллионов атомов [1]). Для работы на многопроцессорных системах используется интерфейс MPI.

LAAMPS

- крупномасштабный атомно/молекулярный массивно-параллельный симулятор.Можно скомпилировать как параллельную версию LAMMPS (использует MPI), так и версию для запуска в однопроцессорном режиме.В LAMMPS реализована поддержка большинства двухчастичных и многочастичных короткодействующих потенциалов (потенциалы Леннард-Джонса, Морзе, Юкавы, EAM, AI-REBO).Реализована возможность вывода в нативный формат для визуализатора AtomEye.Использование графических процессоров для расчета (технология CUDA). Графические процессоры можно использовать только для потенциалов Леннард-Джонса и Кулона. В данном пакете осуществляется повышение производительности процесса за счет распараллеливания процессорных вычислений и операций ввода-вывода,что является определнно достоинством системы. Параллельные вычисления — способ организации компьютерных вычислений, при котором программы разрабатываются как набор взаимодействующих вычислительных процессов, работающих параллельно (одновременно). Термин охватывает совокупность вопросов параллелизма в программировании, а также создание эффективно действующих аппаратных реализаций. Теория параллельных вычислений составляет раздел прикладной теории алгоритмов.

Реализация

Существуют различные способы реализации параллельных вычислений. В программе LAMMPS осуществляется взаимодействие c помощью передачи сообщений: на каждом процессоре многопроцессорной системы запускается одно-поточный процесс, который обменивается данными с другими процессами, работающими на других процессорах, с помощью сообщений. Распараллеливание является пространственным,то есть каждый поток отвечает за свою часть пространства,каждому потоку соответствует свое ядро,которое интегрирует движение подмножества частиц. В пакете реализована квазимногозадачность на уровне одного исполняемого процесса, то есть все потоки выполняются в адресном пространстве процесса.Так же выполняющийся процесс имеет как минимум один (главный) поток. Так как в пакете используется много-поточность,то есть процесс состоит из нескольких потоков,которые запускаются параллельно,при этом без определенного порядка по времени.Данное свойство помогает обеспечить более эффективное использование ресурсов вычислительной машины. Использование OpenMPI процессов.MPI-схема представляет собой , распределенную работу , при которой определенный поток обрабатывает некоторый пространственный домен.В LAMMPS используется открытый стандарт для распараллеливания,который позволяет описать совокупность подключенных директив препроцессора,библиотек и переменных.Ключевыми элементами OpenMP являются:

  • конструкции для создания потоков (директива parallel),
  • конструкции распределения работы между потоками (директивы DO/for и section),
  • конструкции для управления работой с данными (выражения shared и private для определения класса памяти переменных),
  • конструкции для синхронизации потоков (директивы critical, atomic и barrier),
  • процедуры библиотеки поддержки времени выполнения (например, omp_get_thread_num),
  • переменные окружения (например, OMP_NUM_THREADS).

Процессы создаются явно, путем вызова соответствующей функции операционной системы, а обмен сообщениями — с помощью библиотеки (например, реализация протокола MPI) и осуществляется с помощью команды MPI_Bcast,рассылает сообщения от "корня" остальным процессам,а так же MPI_Sendrecv, при помощи которой посылаются и получаются сообщения.Основная сложность при проектировании параллельных программ — обеспечить правильную последовательность взаимодействий между различными вычислительными процессами, а также координацию ресурсов, разделяемых между процессами.

Процесс

В скомпилированном открытом для пользования, так называемом Open Source коде ,написанном на языке C++ представлены различные классы отвечающие за многопоточность выполняемых задач. в главной main программе создается класс LAMMPS,инициализирует header mpi.h и в конечном итоге синхронизируются все потоки. вначале погружается стандартный класс mpi,затем input и Класс LAMMPS действует по следующей схеме :

LAMMPS->input->file 

input.h считывает входной script и содержит методы, которые соответствуют командам класса LAMMPS.

input.cpp сопоставляет каждой определенной команде свой метод и вызывается file( методы).Строка из input посылается на процессы.

  • Таким образом можно обозначит что, класс LAMMPS загружает mpi и input, где прописаны простейшие функции,функции top-level(а) описаны в самом классе LAMMPS.
  • Начало распараллеливание можно обозначит в классе create_box, в котором вызывается класс domain,так как система вызовов классов и в каждом классе изначально подгружается другой, первоначальным можно считать взаимодействие классов domain,comm.cpp,atom_vec.
  • подключив comm.h в domain.cpp описывается параметрический расчет области, как локально в одном потоке, так и во всем общем процессе(set local_box;set global_box),описываются периодические граничные условия.
  • Подключаем atom_vec.h в comm.cppи все основные функции MPI.Получаем размер коммуникатора world,(общее число процессов в рамках задачи); номер текущего процесса в рамка коммуникатора world,происходит рассылка количества интервалов всем процессам (в том числе и себе).Далее происходит заполнение массива ,где хранятся методы для взаимодействия частиц,создается 3d сетка процессов,основанная на количестве процессов,размере области и образа форм.Задаются размеры по-атомно при переднем/заднем/граничном значения увеличения скорости и фиксируется количество частиц.Обновляются параметры взаимодействия.Задаются размеры сетки процессоров.Проверка ошибок на сетке процессов.Создается ID-карта для 3d сетки процессоров.Информация выводится на экран.
  • atom_vecподключает класс domain и создает копии аргументов для перезапуска и повторений.Копируются данные по переназначению скорости из domain.Собирают и записываются значения скоростей.Собираются и записываются граничные данные, если данные негативные,то происходит откат к позитивным.Записываются угловые взаимодействия.Записывваются Все необходимые значения упаковываются и импортируются в файл с данными.

Таким образом если обобщить все выше описанное можно описать некую модель взаимодействия и расчета области разбитой по потокам. Существует некое количество процессоров, к каждому процессору относятся свои и соседние атомы, для описания расчета сил используется класс force.cpp и pair_xxx.cpp для частиц.И чтобы просчитать все взаимодействия на процессоре необходимы данные с предыдущего.Такой способ подсчета является эффективным и в большинстве задач более выгодным для реализации.