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

Материал из Department of Theoretical and Applied Mechanics
Перейти к: навигация, поиск
(Реализация параллельного вычисления в пакете LAMMPS по средством MPI на языке Си++)
(Запуск программы)
 
(не показано 18 промежуточных версий 3 участников)
Строка 1: Строка 1:
==''' Реализация параллельного вычисления в пакете LAMMPS  по средством MPI на языке Си++ ''' ==
+
==Реализация параллельного вычисления в пакете LAMMPS  посредством MPI на языке Си++ ===
  
 
[[Файл:Logo.gif|center|300px]]
 
[[Файл:Logo.gif|center|300px]]
Строка 5: Строка 5:
 
В данном разделе хотелось бы осветить, как осуществляется параллелизм в пакете LAMMPS (англ. Large-scale Atomic/Molecular Massively Parallel Simulator). А именно, пакете для классической молекулярной динамики, написанный группой из Сандийских национальных лабораторий. Он может применяться для крупных расчётов (до десятков миллионов атомов [1]). Для работы на многопроцессорных системах используется интерфейс MPI.
 
В данном разделе хотелось бы осветить, как осуществляется параллелизм в пакете LAMMPS (англ. Large-scale Atomic/Molecular Massively Parallel Simulator). А именно, пакете для классической молекулярной динамики, написанный группой из Сандийских национальных лабораторий. Он может применяться для крупных расчётов (до десятков миллионов атомов [1]). Для работы на многопроцессорных системах используется интерфейс MPI.
  
== LAAMPS ==
+
== LAMMPS ==
- крупномасштабный атомно/молекулярный массивно-параллельный симулятор.
+
- крупномасштабный атомно/молекулярный массивно-параллельный симулятор. Можно скомпилировать как параллельную версию LAMMPS (использует MPI), так и версию для запуска в одно-процессорном режиме. В LAMMPS реализована поддержка большинства двухчастичных и многочастичных короткодействующих потенциалов (потенциалы Леннард-Джонса, Морзе, Юкавы, EAM, AI-REBO). Реализована возможность вывода в нативный формат для визуализатора AtomEye. Использование графических процессоров для расчета (технология CUDA). Графические процессоры можно использовать только для потенциалов Леннард-Джонса и Кулона.
В которой осуществляется повышение производительности процесса за счет распараллеливания процессорных вычислений и операций ввода-вывода,что является определнно достоинством системы.
+
В данном пакете осуществляется повышение производительности процесса за счет распараллеливания процессорных вычислений и операций ввода-вывода,что является определенно достоинством системы.
 
Параллельные вычисления — способ организации компьютерных вычислений, при котором программы разрабатываются как набор взаимодействующих вычислительных процессов, работающих параллельно (одновременно). Термин охватывает совокупность вопросов параллелизма в программировании, а также создание эффективно действующих аппаратных реализаций. Теория параллельных вычислений составляет раздел прикладной теории алгоритмов.
 
Параллельные вычисления — способ организации компьютерных вычислений, при котором программы разрабатываются как набор взаимодействующих вычислительных процессов, работающих параллельно (одновременно). Термин охватывает совокупность вопросов параллелизма в программировании, а также создание эффективно действующих аппаратных реализаций. Теория параллельных вычислений составляет раздел прикладной теории алгоритмов.
Существуют различные способы реализации параллельных вычислений. В программе LAMMPS осуществляется взаимодействие c помощью передачи сообщений: на каждом процессоре многопроцессорной системы запускается одно-поточный процесс, который обменивается данными с другими процессами, работающими на других процессорах, с помощью сообщений.  
+
 
Распараллеливание является пространственным,то есть каждый поток отвечает за свою часть пространства,каждому потоку соответствует свое ядро,которое интегрирует движение подмножества частиц. В пакете реализована квазимногозадачность на уровне одного исполняемого процесса, то есть все потоки выполняются в адресном пространстве процесса.Так же выполняющийся процесс имеет как минимум один (главный) поток.Так как в пакете используется много-поточность,то есть процесс состоит из нескольких потоков,которые запускаются параллельно,при этом без определенного порядка по времени.Данное свойство помогает обеспечить более эффективное использование ресурсов вычислительной машины.
+
== Реализация ==
Использование OpenMPI процессов.MPI-схема представляет собой , распределенную работу , при которой определенный поток обрабатывает некоторый пространственный домен.В LAMMPS используется открытый стандарт для  распараллеливания,который позволяет описать совокупность подключенных директив препроцессора,библиотек и переменных.Ключевыми элементами OpenMP являются:
+
Существуют различные способы реализации параллельных вычислений. В программе LAMMPS осуществляется взаимодействие c помощью передачи сообщений: на каждом процессоре многопроцессорной системы запускается одно-поточный процесс, который обменивается данными с другими процессами, работающими на других процессорах, с помощью сообщений.  
* конструкции для создания потоков (директива parallel),
+
Распараллеливание является пространственным, то есть каждый поток отвечает за свою часть пространства, каждому потоку соответствует свое ядро, которое интегрирует движение подмножества частиц. В пакете реализована квазимногозадачность на уровне одного исполняемого процесса, то есть все потоки выполняются в адресном пространстве процесса. Так же выполняющийся процесс имеет как минимум один (главный) поток.
* конструкции распределения работы между потоками (директивы DO/for и section),
+
 
* конструкции для управления работой с данными (выражения shared и private для определения класса памяти переменных),
+
 
* конструкции для синхронизации потоков (директивы critical, atomic и barrier),
+
[[Файл:Mpi.png|400px]]
* процедуры библиотеки поддержки времени выполнения (например, omp_get_thread_num),
+
* переменные окружения (например, OMP_NUM_THREADS).
+
Так как в пакете используется много-поточность, то есть процесс состоит из нескольких потоков, которые запускаются параллельно, при этом без определенного порядка по времени. Данное свойство помогает обеспечить более эффективное использование ресурсов вычислительной машины.
Процессы создаются явно, путем вызова соответствующей функции операционной системы, а обмен сообщениями — с помощью библиотеки (например, реализация протокола MPI) и осуществляется с помощью команды MPI_Bcast,рассылает сообщения от "корня" остальным процессам,а так же MPI_Sendrecv, при помощи которой посылаются и получаются сообщения.Основная сложность при проектировании параллельных программ — обеспечить правильную последовательность взаимодействий между различными вычислительными процессами, а также координацию ресурсов, разделяемых между процессами.
+
Использование OpenMPI процессов. MPI-схема представляет собой, распределенную работу, при которой определенный поток обрабатывает некоторый пространственный домен. В LAMMPS используется открытый стандарт для  распараллеливания, который позволяет описать совокупность подключенных директив препроцессора, библиотек и переменных. Базовым механизмом связи между MPI процессами является передача и приём сообщений. Сообщение несёт в себе передаваемые данные и информацию, позволяющую принимающей стороне осуществлять их выборочный приём:
В скомпилированном открытом для пользования, так называемом Open Source коде ,написанном на языке C++ представлены  различные классы отвечающие за многопоточность выполняемых задач.  
+
 
в главной main программе создается класс LAMMPS,инициализирует header mpi.h и в конечном итоге синхронизируются все потоки.
+
* отправитель — ранг (номер в группе) отправителя сообщения;
вначале погружается стандартный класс mpi,затем input и ''Класс'' LAMMPS  действует по следующей схеме :  
+
* получатель — ранг получателя;
 +
* признак — может использоваться для разделения различных видов сообщений;
 +
* коммуникатор — код группы процессов.
 +
* Операции приёма и передачи могут быть блокирующиеся и неблокирующиеся. Для неблокирующихся операций определены функции проверки готовности и ожидания выполнения операции.
 +
 
 +
Другим способом связи является удалённый доступ к памяти (RMA), позволяющий читать и изменять область памяти удалённого процесса. Локальный процесс может переносить область памяти удалённого процесса (внутри указанного процессами окна) в свою память и обратно, а также комбинировать данные, передаваемые в удалённый процесс с имеющимися в его памяти данными (например, путём суммирования). Все операции удалённого доступа к памяти не блокирующиеся, однако, до и после их выполнения необходимо вызывать блокирующиеся функции синхронизации.
 +
 
 +
== Запуск программы ==
 +
В открытом для пользователя, так называемом Open Source коде, написанном на языке C++ представлены  различные классы, отвечающие за много-поточность выполняемых задач.
 +
 +
Рассмотрим главную "main" программу, в ней создается класс LAMMPS, инициализируется header mpi.h и в конечном итоге синхронизируются все потоки.
 +
Вначале подгружается mpi.h, затем подключается input и далее класс''LAMMPS'' действует по следующей схеме :  
 
   
 
   
 
  LAMMPS->input->file  
 
  LAMMPS->input->file  
  
 
input.h  считывает входной script  и содержит методы, которые соответствуют командам класса LAMMPS.
 
input.h  считывает входной script  и содержит методы, которые соответствуют командам класса LAMMPS.
 +
В то время как input сопоставляет каждой определенной команде свой метод и вызывается file(методы).Сообщение из input посылается на процессы.
 +
 +
* Таким образом можно обозначит что, класс LAMMPS  загружает mpi и input, где прописаны простейшие функции, функции top-level(а) описаны в самом классе LAMMPS.
  
input.cpp сопоставляет каждой определенной команде свой метод и вызывается file( методы).Строка из input  посылается на процессы.
+
* Началом распараллеливания можно считать  класс ''create_box'', в котором вызывается класс '' domain '', include подключает заголовочные файлы, чтобы компилятор видел, где искать нужные функции, в каждом классе изначально подгружается нужная директивы препроцессора, первоначальным можно считать взаимодействие классов ''domain'', ''comm.cpp'', ''atom_vec''.
  
* Таким образом можно обозначит что, класс LAMMPS  загружает mpi и input, где прописаны простейшие функции,функции top-level(а) описаны в самом классе LAMMPS.
+
* Подключив comm.h в ''domain'' -делится пространство, описывается параметрический расчет области, как локально в одном потоке, так и во всем общем процессе(''set local_box;set global_box''), так же описываются периодические граничные условия.
* Начало распараллеливание можно обозначит в классе ''create_box'', в котором вызывается класс domain,так как  система вызовов классов и в каждом классе изначально подгружается другой, первоначальным можно считать взаимодействие классов ''domain'',''comm.cpp'',''atom_vec''.
+
*В классе neighbor_list хранится информация о соседних и мнимых атомах.
* подключив comm.h в ''domain.cpp'' описывается параметрический расчет области, как локально в одном потоке, так и во всем общем процессе(set local_box;set global_box),описываются периодические граничные условия.
+
*  Подключаем atom_vec.h  в ''comm''и все основные функции MPI. В comm.cpp-реализован процесс обмен между процессами.
*  Подключаем atom_vec.h  в ''comm.cpp'',где хранятся методы для взаимодействия частиц,создает 3d сетку процессов,основанную на количестве процессов,размере области и образа форм.Задаются размеры  по-атомно при  переднем/заднем/граничном значения увеличения скорости и фиксируется количество частиц.Обновляются параметры взаимодействия.Задаются размеры сетки процессоров.Проверка ошибок на сетке процессов.Создается ID-карта для 3d сетки процессоров.Информация выводится на  экран.
+
Получаем размер коммуникатора world, (общее число процессов в рамках задачи); номер текущего процесса в рамка коммуникатора world, происходит рассылка количества интервалов всем процессам (в том числе и себе).
* ''atom_vec''подключает класс ''domain'' и создает копии аргументов для перезапуска и повторений.Копируются данные по переназначению скорости из domain.Собирают и записываются значения скоростей.Собираются и записываются граничные данные, если данные негативные,то происходит откат к позитивным.Записываются  угловые взаимодействия. Все необходимые значения упаковываются и импортируются в файл с данными.
+
Далее происходит заполнение массива, где хранятся методы для взаимодействия частиц.Создается ID-карта для 3d сетки процессоров, основанная на количестве процессов, размере области и образа форм. Задаются размеры  по-атомно при  переднем/заднем/граничном значения увеличения скорости и фиксируется количество частиц.
 +
Вскоре обновляются параметры взаимодействия, задаются размеры сетки процессоров и идет проверка ошибок на сетке процессов. Информация выводится на  экран.
 +
* ''atom_vec''подключает класс ''domain'' и создает копии аргументов для перезапуска и повторений. Копируются данные по переназначению скорости из domain. Собирают и записываются значения скоростей, граничные данные, если данные негативные, то происходит откат к позитивным.
 +
Записываются  угловые взаимодействия,информация о внутренних угловых значениях. Все необходимые значения упаковываются и импортируются в файл с данными.
 +
Обобщение
 
Таким образом если обобщить все выше описанное можно описать некую модель взаимодействия и расчета области разбитой по потокам.
 
Таким образом если обобщить все выше описанное можно описать некую модель взаимодействия и расчета области разбитой по потокам.
Существует некое количество процессоров, к каждому процессору относятся свои и соседние атомы, для описания расчета сил используется класс force.cpp  и pair_xxx.cpp для частиц.И чтобы просчитать все взаимодействия на процессоре необходимы данные с предыдущего.Такой способ подсчета является эффективным и в большинстве задач более выгодным для реализации.
+
Существует некое количество процессоров, к каждому процессору относятся свои и соседние атомы, для описания расчета сил используется класс force.cpp  и pair_xxx.cpp для частиц. И чтобы просчитать все взаимодействия на процессоре необходимы данные с предыдущего. Такой способ подсчета является эффективным и в большинстве задач более выгодным для реализации.

Текущая версия на 20:13, 28 апреля 2015

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

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

LAMMPS[править]

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

Реализация[править]

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


Mpi.png

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

  • отправитель — ранг (номер в группе) отправителя сообщения;
  • получатель — ранг получателя;
  • признак — может использоваться для разделения различных видов сообщений;
  • коммуникатор — код группы процессов.
  • Операции приёма и передачи могут быть блокирующиеся и неблокирующиеся. Для неблокирующихся операций определены функции проверки готовности и ожидания выполнения операции.

Другим способом связи является удалённый доступ к памяти (RMA), позволяющий читать и изменять область памяти удалённого процесса. Локальный процесс может переносить область памяти удалённого процесса (внутри указанного процессами окна) в свою память и обратно, а также комбинировать данные, передаваемые в удалённый процесс с имеющимися в его памяти данными (например, путём суммирования). Все операции удалённого доступа к памяти не блокирующиеся, однако, до и после их выполнения необходимо вызывать блокирующиеся функции синхронизации.

Запуск программы[править]

В открытом для пользователя, так называемом Open Source коде, написанном на языке C++ представлены различные классы, отвечающие за много-поточность выполняемых задач.

Рассмотрим главную "main" программу, в ней создается класс LAMMPS, инициализируется header mpi.h и в конечном итоге синхронизируются все потоки. Вначале подгружается mpi.h, затем подключается input и далее классLAMMPS действует по следующей схеме :

LAMMPS->input->file 

input.h считывает входной script и содержит методы, которые соответствуют командам класса LAMMPS. В то время как input сопоставляет каждой определенной команде свой метод и вызывается file(методы).Сообщение из input посылается на процессы.

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

Получаем размер коммуникатора world, (общее число процессов в рамках задачи); номер текущего процесса в рамка коммуникатора world, происходит рассылка количества интервалов всем процессам (в том числе и себе). Далее происходит заполнение массива, где хранятся методы для взаимодействия частиц.Создается ID-карта для 3d сетки процессоров, основанная на количестве процессов, размере области и образа форм. Задаются размеры по-атомно при переднем/заднем/граничном значения увеличения скорости и фиксируется количество частиц. Вскоре обновляются параметры взаимодействия, задаются размеры сетки процессоров и идет проверка ошибок на сетке процессов. Информация выводится на экран.

  • atom_vecподключает класс domain и создает копии аргументов для перезапуска и повторений. Копируются данные по переназначению скорости из domain. Собирают и записываются значения скоростей, граничные данные, если данные негативные, то происходит откат к позитивным.

Записываются угловые взаимодействия,информация о внутренних угловых значениях. Все необходимые значения упаковываются и импортируются в файл с данными.

Обобщение

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