Как создать кластер Linux для запуска физического моделирования в Java?

StackOverflow https://stackoverflow.com/questions/333626

Вопрос

Я разрабатываю научное приложение, используемое для физического моделирования.Используются алгоритмы O(n3), поэтому для обработки большого набора данных требуется очень много времени.Приложение запускает симуляцию примерно за 17 минут, а мне нужно запустить около 25 000 симуляций.Это примерно год обработки.

Хорошей новостью является то, что симуляции полностью независимы друг от друга, поэтому я могу легко изменить программу, чтобы распределить работу между несколькими компьютерами.

Я вижу несколько решений для реализации этого:

  • Возьмите многоядерный компьютер и распределите работу между всеми ядрами.Недостаточно для того, что мне нужно сделать.
  • Напишите приложение, которое подключается к нескольким серверам «обработки» и распределяет нагрузку между ними.
  • Получите кластер дешевых компьютеров с Linux, и программа будет рассматривать все как единое целое.

Вариант номер 2 относительно легко реализовать, поэтому я не особо ищу предложений о том, как это реализовать (можно просто написать программу, которая ожидает на заданном порту параметров, обрабатывает значения и возвращает результат). как сериализованный файл).Это было бы хорошим примером Грид-вычисления.

Однако меня удивляют возможности последнего варианта — традиционного кластера.Насколько сложно запустить программу Java в сетке Linux?Будут ли все отдельные компьютеры рассматриваться как один компьютер с несколькими ядрами, что позволит легко адаптировать программу?Есть ли какие-нибудь хорошие указатели на ресурсы, которые позволили бы мне начать?Или я слишком усложняю задачу и мне лучше использовать вариант номер 2?

РЕДАКТИРОВАТЬ:В качестве дополнительной информации меня интересует, как реализовать что-то вроде описанного в этой статье из журнала Wired Magazine: Scientific заменил суперкомпьютер Linux-кластером Playstation 3.Определенно номер два звучит как лучший вариант...но фактор крутости.

РЕДАКТИРОВАТЬ 2:Расчет сильно зависит от процессора.В основном существует множество операций с большими матрицами, таких как обращение и умножение.Я пытался найти лучшие алгоритмы для этих операций, но пока обнаружил, что мне нужны операции 0 (n3) (в обычно доступных библиотеках).Набор данных большой (для таких операций), но создается на клиенте на основе входных параметров.


Теперь я вижу, что у меня было непонимание того, как работает компьютерный кластер под Linux.У меня было предположение, что это будет работать таким образом, что будет казаться, что у вас есть все процессоры на всех доступных компьютерах, как если бы у вас был компьютер с несколькими ядрами, но, похоже, это не так.Кажется, что все эти суперкомпьютеры работают, имея узлы, выполняющие задачи, распределенные неким центральным объектом, и что существует несколько различных библиотек и пакетов программного обеспечения, которые позволяют легко выполнять это распределение.

Итак, вопрос на самом деле сводится к тому, что такого понятия, как номер 3, не существует:Как лучше всего создать кластерное Java-приложение?

Это было полезно?

Решение

Я очень рекомендую Java Parallel Processing Framework, тем более что ваши вычисления уже независимы.Я немало поработал с этим студентом, и он работает очень хорошо.Работа по реализации уже сделана за вас, поэтому я думаю, что это хороший способ достичь цели «номера 2».

http://www.jppf.org/

Другие советы

Номер 3 сделать не сложно.Это требует разработки двух отдельных приложений: клиента и супервизора.Клиент — это почти то же самое, что у вас уже есть: приложение, запускающее симуляцию.Однако его необходимо изменить, чтобы он подключался к супервизору с помощью TCP/IP или чего-то еще и запрашивал набор параметров моделирования.Затем он запускает моделирование и отправляет результаты обратно руководителю.Супервизор прослушивает запросы от клиентов и для каждого запроса получает нераспределенную модель из базы данных и обновляет базу данных, чтобы указать, что элемент распределен, но не завершен.Когда моделирование завершено, супервизор обновляет базу данных с результатами.Если супервизор хранит данные в реальной базе данных (MySql и т. д.), тогда в базе данных можно легко запросить текущее состояние моделирования.Это должно хорошо масштабироваться до момента, когда время, необходимое для предоставления данных моделирования всем клиентам, будет равно времени, необходимому для выполнения моделирования.

Самый простой способ распределить вычисления в кластере Linux — использовать MPI.Я бы посоветовал вам скачать и посмотреть MPICH2.Это бесплатно. их домашняя страница здесь

Если ваши симуляции полностью независимы, вам не понадобятся большинство функций MPI.Возможно, вам придется написать несколько строк на языке C для взаимодействия с MPI и запуска выполнения вашего сценария или программы Java.

Вам следует проверить Хейзелкаст, простейшее решение для кластеризации Peer2Peer (без централизованного сервера) для Java.Попробуйте Hazelcast Distributed ExecutorService для выполнения вашего кода в кластере.

С уважением,

-губка

Вы уже это предлагали, но дисквалифицировали:Многоядерные.Вы можете выбрать многоядерный процессор, если у вас достаточно ядер.Одной из горячих тем являются вычисления на GPGPU.ОсобенноNVIDIA CUDA — это очень перспективный подход, если у вас много независимых задач, которые должны выполнять одни и те же вычисления.GTX 280 имеет 280 ядер, которые могут обрабатывать до 1120–15360 потоков одновременно.Пара из них может решить вашу проблему.Если это действительно реализуемо, зависит от вашего алгоритма (поток данных или поток данных).поток управления), поскольку все скалярные процессоры работают по принципу SIMD.

Недостаток:это будет C/C++, а не Java

Насколько оптимизированы ваши алгоритмы?Используете ли вы собственные библиотеки BLAS?Прирост производительности примерно на порядок можно получить, перейдя с наивных библиотек на оптимизированные.Некоторые из них, например ATLAS, также автоматически распределяют вычисления по нескольким процессорам в системе, так что это автоматически охватывает пункт 1.

Кластеры AFAIK обычно не рассматриваются как единое целое.Обычно они рассматриваются как отдельные узлы и программируются с помощью таких вещей, как MPI и SCALAPACK, для распределения элементов матриц по нескольким узлам.Это не особо вам поможет, если ваш набор данных в любом случае умещается в памяти на одном узле.

Вы посмотрели Терракота?

Для распределения работы вы захотите использовать Структура Мастер/Работник.

Десять лет назад компания, в которой я работал, рассматривала похожее решение для виртуализации, и Sun, Digital и HP в то время поддерживали его, но только с использованием самых современных суперкомпьютеров с возможностью горячей замены оборудования и тому подобное.С тех пор я слышал, что Linux поддерживает тот тип виртуализации, который вам нужен для решения № 3, но сам я никогда им не пользовался.

Примитивы Java и производительность

Однако если вы выполняете матричные вычисления, вам следует выполнять их в собственном коде, а не в Java (при условии, что вы используете примитивы Java).В частности, промахи в кэше обходятся очень дорого, а чередование в ваших массивах снижает производительность.Нечередующиеся фрагменты памяти в ваших матрицах и собственном коде обеспечат вам большую часть ускорения без дополнительного оборудования.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top