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

Материал из Department of Theoretical and Applied Mechanics
Перейти к: навигация, поиск
(Реализация)
(Запуск программы)
 
(не показаны 4 промежуточные версии этого же участника)
Строка 13: Строка 13:
 
Существуют различные способы реализации параллельных вычислений. В программе LAMMPS осуществляется взаимодействие c помощью передачи сообщений: на каждом процессоре многопроцессорной системы запускается одно-поточный процесс, который обменивается данными с другими процессами, работающими на других процессорах, с помощью сообщений.  
 
Существуют различные способы реализации параллельных вычислений. В программе LAMMPS осуществляется взаимодействие c помощью передачи сообщений: на каждом процессоре многопроцессорной системы запускается одно-поточный процесс, который обменивается данными с другими процессами, работающими на других процессорах, с помощью сообщений.  
 
Распараллеливание является пространственным, то есть каждый поток отвечает за свою часть пространства, каждому потоку соответствует свое ядро, которое интегрирует движение подмножества частиц. В пакете реализована квазимногозадачность на уровне одного исполняемого процесса, то есть все потоки выполняются в адресном пространстве процесса. Так же выполняющийся процесс имеет как минимум один (главный) поток.
 
Распараллеливание является пространственным, то есть каждый поток отвечает за свою часть пространства, каждому потоку соответствует свое ядро, которое интегрирует движение подмножества частиц. В пакете реализована квазимногозадачность на уровне одного исполняемого процесса, то есть все потоки выполняются в адресном пространстве процесса. Так же выполняющийся процесс имеет как минимум один (главный) поток.
 +
 +
 +
[[Файл:Mpi.png|400px]]
 +
 
Так как в пакете используется много-поточность, то есть процесс состоит из нескольких потоков, которые запускаются параллельно, при этом без определенного порядка по времени. Данное свойство помогает обеспечить более эффективное использование ресурсов вычислительной машины.
 
Так как в пакете используется много-поточность, то есть процесс состоит из нескольких потоков, которые запускаются параллельно, при этом без определенного порядка по времени. Данное свойство помогает обеспечить более эффективное использование ресурсов вычислительной машины.
 
Использование OpenMPI процессов. MPI-схема представляет собой, распределенную работу, при которой определенный поток обрабатывает некоторый пространственный домен. В LAMMPS используется открытый стандарт для  распараллеливания, который позволяет описать совокупность подключенных директив препроцессора, библиотек и переменных.  Базовым механизмом связи между MPI процессами является передача и приём сообщений. Сообщение несёт в себе передаваемые данные и информацию, позволяющую принимающей стороне осуществлять их выборочный приём:
 
Использование OpenMPI процессов. MPI-схема представляет собой, распределенную работу, при которой определенный поток обрабатывает некоторый пространственный домен. В LAMMPS используется открытый стандарт для  распараллеливания, который позволяет описать совокупность подключенных директив препроцессора, библиотек и переменных.  Базовым механизмом связи между MPI процессами является передача и приём сообщений. Сообщение несёт в себе передаваемые данные и информацию, позволяющую принимающей стороне осуществлять их выборочный приём:
Строка 24: Строка 28:
 
Другим способом связи является удалённый доступ к памяти (RMA), позволяющий читать и изменять область памяти удалённого процесса. Локальный процесс может переносить область памяти удалённого процесса (внутри указанного процессами окна) в свою память и обратно, а также комбинировать данные, передаваемые в удалённый процесс с имеющимися в его памяти данными (например, путём суммирования). Все операции удалённого доступа к памяти не блокирующиеся, однако, до и после их выполнения необходимо вызывать блокирующиеся функции синхронизации.
 
Другим способом связи является удалённый доступ к памяти (RMA), позволяющий читать и изменять область памяти удалённого процесса. Локальный процесс может переносить область памяти удалённого процесса (внутри указанного процессами окна) в свою память и обратно, а также комбинировать данные, передаваемые в удалённый процесс с имеющимися в его памяти данными (например, путём суммирования). Все операции удалённого доступа к памяти не блокирующиеся, однако, до и после их выполнения необходимо вызывать блокирующиеся функции синхронизации.
  
== Процесс ==
+
== Запуск программы ==
В скомпилированном открытом для пользователя, так называемом Open Source коде, написанном на языке C++ представлены  различные классы, отвечающие за много-поточность выполняемых задач.  
+
В открытом для пользователя, так называемом Open Source коде, написанном на языке C++ представлены  различные классы, отвечающие за много-поточность выполняемых задач.
 +
 
Рассмотрим главную "main" программу, в ней создается класс LAMMPS, инициализируется header mpi.h и в конечном итоге синхронизируются все потоки.
 
Рассмотрим главную "main" программу, в ней создается класс LAMMPS, инициализируется header mpi.h и в конечном итоге синхронизируются все потоки.
Вначале подгружается mpi.h хедер(header)- средство позволяющее обобщить информацию между различными модулями, в нем содержится информация об используемых функциях.Затем подключается input и далее ''Класс'' LAMMPS  действует по следующей схеме :  
+
Вначале подгружается mpi.h, затем подключается input и далее класс''LAMMPS'' действует по следующей схеме :  
 
   
 
   
 
  LAMMPS->input->file  
 
  LAMMPS->input->file  
  
 
input.h  считывает входной script  и содержит методы, которые соответствуют командам класса LAMMPS.
 
input.h  считывает входной script  и содержит методы, которые соответствуют командам класса LAMMPS.
 
+
В то время как input сопоставляет каждой определенной команде свой метод и вызывается file(методы).Сообщение из input посылается на процессы.
в то время как input.cpp сопоставляет каждой определенной команде свой метод и вызывается file(методы).Сообщение из input посылается на процессы.
 
  
 
* Таким образом можно обозначит что, класс LAMMPS  загружает mpi и input, где прописаны простейшие функции, функции top-level(а) описаны в самом классе LAMMPS.
 
* Таким образом можно обозначит что, класс LAMMPS  загружает mpi и input, где прописаны простейшие функции, функции top-level(а) описаны в самом классе LAMMPS.
Строка 39: Строка 43:
 
* Началом распараллеливания можно считать  класс ''create_box'', в котором вызывается класс '' domain '', include подключает заголовочные файлы, чтобы компилятор видел, где искать нужные функции, в каждом классе изначально подгружается нужная директивы препроцессора, первоначальным можно считать взаимодействие классов ''domain'', ''comm.cpp'', ''atom_vec''.
 
* Началом распараллеливания можно считать  класс ''create_box'', в котором вызывается класс '' domain '', include подключает заголовочные файлы, чтобы компилятор видел, где искать нужные функции, в каждом классе изначально подгружается нужная директивы препроцессора, первоначальным можно считать взаимодействие классов ''domain'', ''comm.cpp'', ''atom_vec''.
  
* Подключив comm.h в ''domain.cpp'' описывается параметрический расчет области, как локально в одном потоке, так и во всем общем процессе(set local_box;set global_box) так же описываются периодические граничные условия.
+
* Подключив comm.h в ''domain'' -делится пространство, описывается параметрический расчет области, как локально в одном потоке, так и во всем общем процессе(''set local_box;set global_box''), так же описываются периодические граничные условия.
 
+
*В классе neighbor_list хранится информация о соседних и мнимых атомах.
*  Подключаем atom_vec.h  в ''comm.cpp''и все основные функции MPI.
+
*  Подключаем atom_vec.h  в ''comm''и все основные функции MPI. В comm.cpp-реализован процесс обмен между процессами.
 
Получаем размер коммуникатора world, (общее число процессов в рамках задачи); номер текущего процесса в рамка коммуникатора world, происходит рассылка количества интервалов всем процессам (в том числе и себе).
 
Получаем размер коммуникатора world, (общее число процессов в рамках задачи); номер текущего процесса в рамка коммуникатора world, происходит рассылка количества интервалов всем процессам (в том числе и себе).
Далее происходит заполнение массива, где хранятся методы для взаимодействия частиц.Создается ID-карта для 3d сетки процессоров, основанная на количестве процессов, размере области и образа форм.Задаются размеры  по-атомно при  переднем/заднем/граничном значения увеличения скорости и фиксируется количество частиц.
+
Далее происходит заполнение массива, где хранятся методы для взаимодействия частиц.Создается ID-карта для 3d сетки процессоров, основанная на количестве процессов, размере области и образа форм. Задаются размеры  по-атомно при  переднем/заднем/граничном значения увеличения скорости и фиксируется количество частиц.
 
Вскоре обновляются параметры взаимодействия, задаются размеры сетки процессоров и идет проверка ошибок на сетке процессов. Информация выводится на  экран.
 
Вскоре обновляются параметры взаимодействия, задаются размеры сетки процессоров и идет проверка ошибок на сетке процессов. Информация выводится на  экран.
* ''atom_vec''подключает класс ''domain'' и создает копии аргументов для перезапуска и повторений.Копируются данные по переназначению скорости из domain.Собирают и записываются значения скоростей, граничные данные, если данные негативные, то происходит откат к позитивным.
+
* ''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 для частиц. И чтобы просчитать все взаимодействия на процессоре необходимы данные с предыдущего. Такой способ подсчета является эффективным и в большинстве задач более выгодным для реализации.