2015-03-26 2 views
1

Я пишу программу в java для работы на HPC с использованием MPI, но у меня такое чувство, что я трачу ресурсы из-за того, как работает open-mpi. Я на самом деле не совсем уверен, как это работает, но я полагаю, что mpirun -n 10 java myProgram.java запускает 10 раз myProgram на разных узлах/ядрах и т. Д. (в зависимости от привязки) каждый раз. Это также означает, что, насколько я понимаю JVM, работает 10 JVM.сокращение количества JVM, используемых mpi

После некоторых тестов с моей программой, используя настройки по умолчанию (привязка к ядрам и упаковка как можно больше на 1 узел), я понял, что использование памяти было очень низким, и пришел к выводу, что мне придется сделать что-то о множественности JVM. Я попытался ослабить привязку от ядер к узлам, но тогда я не использую всю возможную вычислительную мощность. Я уже пытался использовать многопоточность для решения этой проблемы, но я читал (somew)here, что также не является одной из лучших идей (но я все еще пытаюсь найти способ обойти).

Так что мой вопрос:
Существует ли способ связать каждый узел только с одним JVM, используя open-mpi?
альтернатива: Как я могу лучше использовать память?

Заранее спасибо

+0

В документации по open-mpi (https://www.open-mpi.org/faq/?category=java) указано, что open-mpi имеет интерфейс java. Он предоставляет завершенный компилятор 'mpijavac' и mpirun был обновлен, чтобы обнаружить команду java. Чтобы создать этот интерфейс, open-mpi должен быть настроен с помощью '--enable-mpi-java': вы это сделали? Не могли бы вы попробовать опцию '--showme', чтобы проверить, соответствует ли mpirun open-mpi? – francis

+0

Я сделал это, но поскольку большинство этих команд являются только оболочками, я предполагаю, что я получаю столько JVM, сколько я определил процессы с флагом '-n'. Я все еще только предполагаю, что, потому что я не могу найти, будут ли обертки оптимизировать что-либо для java. –

+0

Да, вы получаете столько же JVM, сколько ряды MPI. Вот что такое MPI - переносимая ** interprocess ** связь (хотя это не указано конкретно в стандарте, практически все популярные реализации MPI относятся к рядам как к отдельным процессам). Если запустить один JVM для MPI-процесса слишком много, вы должны пойти на гибрид, то есть микшировать программируемое программирование с MPI. –

ответ

0

Как Hristo Iliev уже упоминалось в комментариях, гибридный подход решает мою проблему. Чтобы избежать использования MPI_THREAD_MULTIPLE, я распределил работу статически. Затем программу можно запустить с помощью mpirun --map-by ppr:1:node --bind-to board java <java-program>, чтобы ограничить количество процессов, выполняемых на одном узле.

Смежные вопросы