Я занимаюсь разработкой научного приложения для физического моделирования. Используются алгоритмы O (n3), поэтому для большого набора данных обработка занимает очень много времени. Приложение запускает симуляцию примерно за 17 минут, и мне нужно выполнить около 25 000 симуляций. Это около года обработки.
Хорошей новостью является то, что симуляции полностью независимы друг от друга, поэтому я могу легко изменить программу для распределения работы между несколькими компьютерами.
Есть несколько решений, которые я вижу, чтобы реализовать это:
- Получите многоядерный компьютер и распределите работу по всем ядрам. Не достаточно для того, что мне нужно сделать.
- Напишите приложение, которое подключается к нескольким «обрабатывающим» серверам и распределяет нагрузку между ними.
- Получите кластер дешевых компьютеров с Linux, и пусть программа воспринимает все как единое целое.
Вариант № 2 относительно прост в реализации, поэтому я не очень много думаю о том, как это реализовать (можно сделать, просто написав программу, которая ожидает на заданном порту параметров, обрабатывает значения и возвращает результат в виде сериализованного файла). Это был бы хороший пример Grid Computing .
Тем не менее, я удивляюсь возможностям последнего варианта, традиционного кластера. Насколько сложно запустить программу на Java в сетке Linux? Будут ли все отдельные компьютеры рассматриваться как один компьютер с несколькими ядрами, что облегчит адаптацию программы? Есть ли хорошие ссылки на ресурсы, которые позволили бы мне начать? Или я делаю это слишком сложным, и мне лучше с вариантом 2?
РЕДАКТИРОВАТЬ: В качестве дополнительной информации меня интересует, как реализовать нечто подобное описанному в этой статье из журнала Wired: Scientific заменил суперкомпьютер на кластер Linux Playstation 3 . Определенно номер два звучит как путь ... но фактор крутизны.
РЕДАКТИРОВАТЬ 2: Расчет очень сильно ЦП. В основном на больших матрицах много операций, таких как обратное и умножение. Я пытался найти более эффективные алгоритмы для этих операций, но до сих пор я обнаружил, что мне нужно 0 (n3) (в библиотеках, которые обычно доступны). Набор данных большой (для таких операций), но он создается на клиенте на основе входных параметров.
Теперь я вижу, что у меня возникло недоразумение о том, как работает кластер компьютеров под Linux. У меня было предположение, что это будет работать таким образом, что может показаться, что у вас есть все процессоры на всех компьютерах, как если бы у вас был компьютер с несколькими ядрами, но это не так. Кажется, что все эти суперкомпьютеры работают, имея узлы, которые выполняют задачи, распределенные некоторой центральной сущностью, и что есть несколько различных библиотек и пакетов программ, которые позволяют легко выполнять это распределение.
Таким образом, на самом деле возникает вопрос, так как не существует такой вещи, как номер 3, в: Каков наилучший способ создания кластерного Java-приложения?