LAMMPS — различия между версиями
(→Реализация) |
(→Запуск программы) |
||
(не показаны 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++ представлены различные классы, отвечающие за много-поточность выполняемых задач. |
+ | |||
Рассмотрим главную "main" программу, в ней создается класс LAMMPS, инициализируется header mpi.h и в конечном итоге синхронизируются все потоки. | Рассмотрим главную "main" программу, в ней создается класс LAMMPS, инициализируется header mpi.h и в конечном итоге синхронизируются все потоки. | ||
− | Вначале подгружается 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. | * Таким образом можно обозначит что, класс 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 | + | * Подключив comm.h в ''domain'' -делится пространство, описывается параметрический расчет области, как локально в одном потоке, так и во всем общем процессе(''set local_box;set global_box''), так же описываются периодические граничные условия. |
− | + | *В классе neighbor_list хранится информация о соседних и мнимых атомах. | |
− | * Подключаем atom_vec.h в ''comm | + | * Подключаем 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 помощью передачи сообщений: на каждом процессоре многопроцессорной системы запускается одно-поточный процесс, который обменивается данными с другими процессами, работающими на других процессорах, с помощью сообщений. Распараллеливание является пространственным, то есть каждый поток отвечает за свою часть пространства, каждому потоку соответствует свое ядро, которое интегрирует движение подмножества частиц. В пакете реализована квазимногозадачность на уровне одного исполняемого процесса, то есть все потоки выполняются в адресном пространстве процесса. Так же выполняющийся процесс имеет как минимум один (главный) поток.
Так как в пакете используется много-поточность, то есть процесс состоит из нескольких потоков, которые запускаются параллельно, при этом без определенного порядка по времени. Данное свойство помогает обеспечить более эффективное использование ресурсов вычислительной машины. Использование 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 для частиц. И чтобы просчитать все взаимодействия на процессоре необходимы данные с предыдущего. Такой способ подсчета является эффективным и в большинстве задач более выгодным для реализации.