спроектировать разделяемую память для MPI с использованием Boost

Я хотел бы спросить, знает ли кто-нибудь документацию по boost::mpi для начинающих? (я уже читал документацию Boost.MPI с интернет-сайта).

немного о моей системе, у меня есть кластер около 90 узлов, каждый узел имеет два процессора с двумя ядрами (4 ядра вместе) и 4 ГБ оперативной памяти.

я хотел бы определить общую память для каждого узла и хранить там вектор std::vector<bool> occupation;. Затем каждый процесс должен что-то вычислить на основе своего rank() числа.

Теперь все мультипроцессы должны дождаться, пока все ядра закончат вычисления, а затем отправить вектор std::vector<uint32_t> remove; в основной процесс (rank() == 0), который обновит вектор occupation, а затем отправит всем узлам новый вектор occupation.

Возможно, было бы лучше использовать просто mpi.h вместо boost::mpi.

Хотелось бы услышать ваше мнение, так как у меня нет опыта в этой области MPI.


person Eagle    schedule 24.03.2011    source источник


Ответы (2)


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

person Fred Foo    schedule 24.03.2011

Как упоминал larsmans, вы не можете использовать общую память с MPI. Но похоже, что вам действительно не нужна распределенная общая память; похоже, что все задачи должны получить копию occupation в начале, выполнить свои вычисления, отправить свои результаты обратно мастеру в форме remove, а затем мастер транслирует обновленную копию occupation. MPI может сделать это просто отлично.

Можно начать с того, чтобы главный процесс использовал broadcast для первоначальной отправки данных рабочие процессы должны использовать send, чтобы отправить обновления обратно мастеру, и чтобы мастер recv данные по каждой задаче; когда это сделано, цикл повторяется.

person Jonathan Dursi    schedule 24.03.2011
comment
спасибо за Ваш ответ. давайте предположим, что occupation имеет размер 2^30 логических элементов, тогда для каждого процесса требуется 1 ГБ, тогда как на самом деле мне нужен только один occupation вектор для всех 4 ядер... это было причиной моего вопроса - person Eagle; 25.03.2011
comment
Один из способов обойти это — использовать MPI между узлами и многопоточный подход, такой как OpenMP, внутри узлов; тогда каждому узлу нужна только одна копия, и это нормально, если у вас есть 4 ГБ каждый. В противном случае, есть ли какая-то структура для вычислений - все ли задачи требуют всех занятий одновременно? - person Jonathan Dursi; 25.03.2011
comment
occupation является центром программы, и большая часть вычислений должна обращаться к этому вектору во время вычислений. Я немного поискал в сети, и то, что я ищу, называется гибридным программированием? (сочетание MPI и OpenMP) - person Eagle; 25.03.2011
comment
да. Таким образом, вы по-прежнему делаете то, что я предлагаю выше - рассылайте данные, а затем собирайте результаты с помощью отправки/получения; а затем используйте OpenMP (или любые другие возможности, которые может иметь повышение для работы с общей памятью), чтобы разбить вычисления внутри узла. Начните с одного или другого — неважно с какого — и заставьте его работать, а затем добавьте другой. - person Jonathan Dursi; 25.03.2011