2011-03-19 4 views
1

Я пытаюсь использовать MPI для повторной записи процедуры паралеллизации для пакета моделирования, который я использую. Я пытаюсь реализовать определенную функцию и испытываю проблемы. Я собираюсь проиллюстрировать свою проблему, используя другой более простой пример, который показывает, что я пытаюсь сделать.Воспроизведение какой-то «общей памяти» в MPI

Я в основном стараюсь иметь счетчик, который будет использоваться всеми потоками MPI. Каждый раз, когда этот счетчик будет увеличиваться, конкретный поток будет транслировать его всем остальным, чтобы каждый поток имел обновленную версию счетчика, когда он хочет увеличить его. Я понимаю, что это легко выполнимо с использованием OpenMP с общей памятью, но мне интересно, есть ли способ сделать эту работу с MPI более чем одним процессором (например, с помощью 500-ядерного моделирования на суперкомпьютере).

Я пробовал практически любую комбинацию MPI_Bcast, MPI_Send и MPI_Recv, о которых я мог думать, но я думаю, что есть что-то, что я, возможно, не понимаю.

+0

Возможный дубликат: http://stackoverflow.com/questions/4948788/creating-a-counter-that-stays-synchronized-across-mpi-processes – suszterpatt

ответ

2

Вы не сможете сделать это с помощью API MPI-1, которые вы предлагаете выше. Однако MPI-2 позволяет выполнять «операции с удаленной памятью», которые позволяют вам делать такие вещи. Я ответил на очень похожий вопрос здесь, основываясь на MPI-2 book и его online examples: Creating a counter that stays synchronized across MPI processes Там реализовано только «приращение счетчика». Это не делает трансляцию; но вам действительно нужна такая операция? Было бы недостаточно, чтобы другие задачи просто проверяли ценность счетчика всякий раз, когда это было необходимо?

+0

Большое спасибо. Было бы действительно достаточно, чтобы другие задачи проверяли ценность счетчика, на самом деле у меня есть «Количество итераций влево», и каждая работа будет захватывать куски вроде 10 000, пока не осталось никаких итераций от этого счетчика. Все, что им нужно, это способ получить самое современное количество оставшихся итераций, и иметь этот счет, чтобы быть безупречным, если, например, одна из проблем с работой (поэтому я не могу просто разделить число итераций равномерно в начале и просто позволяют им делать свое дело). Я посмотрю ссылки, еще раз спасибо! – Marc

0

Вы не можете инвертировать схему? Создайте выделенный «счетчик-сервер», который любой поток может запросить значение счетчика, когда ему потребуется это значение.

Это может не соответствовать всем сценариям, конечно.

+0

Я думал, что, возможно, этот способ может работать, но количество доступных ядер довольно ограничен в кластере, из которого я запускаю код, поэтому я бы плохо себя чувствовал, используя одно ядро, чтобы ничего не делать, кроме отслеживания счетчика. – Marc

+0

Если обслуживающий счетчик не имеет большого количества ресурсов, вы можете безопасно запустить его на узле вместе со своей обычной нагрузкой. Насколько я понимаю, MPI работает на узлах с обычной ОС, поэтому вы можете просто запустить для него собственный процесс. Обслуживание одного номера даже через постоянно подключаемый TCP-сокет достаточно эффективно и не требует большого количества CPU. – 9000

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