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