что означает настройка MPI для общей памяти?

У меня вопрос, связанный с исследованиями.

В настоящее время я завершил реализацию каркаса каркаса структуры на основе MPI (в частности, используя openmpi 6.3). каркас предполагается использовать на одной машине. теперь я сравниваю его с другими предыдущими реализациями скелета (такими как scandium, fast-flow, ..)

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

Есть большая разница во времени завершения двух категорий.

Сегодня я также познакомился с настройкой open-mpi для разделяемой памяти здесь => openmpi-sm

И вот мой вопрос.

1-е что означает настройка MPI для общей памяти? Я имею в виду, пока процессы MPI живут в своей собственной виртуальной памяти; что на самом деле делает флаг в следующей команде? (Я думал, что в MPI каждое общение осуществляется путем явной передачи сообщения, а память не распределяется между процессами).

    shell$ mpirun --mca btl self,sm,tcp -np 16 ./a.out

2-й, почему производительность MPI намного хуже по сравнению с другими каркасными реализациями, разработанными для разделяемой памяти? По крайней мере, я также запускаю его на одной многоядерной машине. (Я полагаю, это потому, что другая реализация использовала параллельное программирование потоков, но у меня нет убедительного объяснения этого).

любые предложения или дальнейшие обсуждения приветствуются.

Пожалуйста, дайте мне знать, если мне нужно уточнить свой вопрос.

Спасибо за уделенное время!


person LeTex    schedule 21.11.2012    source источник


Ответы (1)


Open MPI очень модульный. У него есть собственная компонентная модель, называемая модульной компонентной архитектурой (MCA). Отсюда и происходит название параметра --mca - он используется для предоставления значений времени выполнения параметрам MCA, экспортируемым различными компонентами в MCA.

Когда два процесса в данном коммуникаторе хотят общаться друг с другом, MCA находит подходящие компоненты, которые могут передавать сообщения от одного процесса к другому. Если оба процесса находятся на одном узле, Open MPI обычно выбирает компонент BTL с общей памятью, известный как sm. Если оба процесса находятся на разных узлах, Open MPI просматривает доступные сетевые интерфейсы и выбирает самый быстрый из них, который может подключиться к другому узлу. Он устанавливает некоторые предпочтения в быстрых сетях, таких как InfiniBand (через компонент openib BTL), но если в вашем кластере нет InfiniBand, TCP / IP используется в качестве запасного варианта, если компонент tcp BTL находится в списке разрешенных BTL.

По умолчанию вам не нужно делать ничего особенного, чтобы разрешить обмен данными с общей памятью. Просто запустите вашу программу с mpiexec -np 16 ./a.out. Вы связались с разделом разделяемой памяти в Open MPI FAQ, который дает подсказки о том, какие параметры sm BTL можно настроить для повышения производительности. Мой опыт работы с Open MPI показывает, что параметры по умолчанию почти оптимальны и работают очень хорошо даже на экзотическом оборудовании, таком как многоуровневые системы NUMA. Обратите внимание, что реализация связи с общей памятью по умолчанию копирует данные дважды - один раз из буфера отправки в общую память и один раз из общей памяти в буфер приема. Ярлык существует в виде устройства ядра KNEM, но вы должны загрузить его и скомпилировать отдельно, как есть не входит в стандартное ядро ​​Linux. Благодаря поддержке KNEM Open MPI может выполнять передачи с нулевым копированием между процессами на одном и том же узле - копия выполняется устройством ядра, и это прямая копия из памяти первого процесса в память второго. процесс. Это значительно улучшает передачу больших сообщений между процессами, находящимися на одном узле.

Другой вариант - полностью забыть о MPI и напрямую использовать разделяемую память. Вы можете использовать интерфейс управления памятью POSIX (см. здесь) для создания блока разделяемой памяти. все процессы работают с ним напрямую. Если данные хранятся в общей памяти, это может быть полезно, поскольку копии не будут создаваться. Но остерегайтесь проблем с NUMA в современных многосокетных системах, где каждый сокет имеет свой собственный контроллер памяти и доступ к памяти из удаленных сокетов на той же плате происходит медленнее. Привязка / привязка процесса также важны - передайте --bind-to-socket в mpiexec, чтобы он привязал каждый процесс MPI к отдельному ядру ЦП.

person Hristo Iliev    schedule 21.11.2012
comment
FWIW, начиная с Linux 3.2, есть системные вызовы process_vm_readv / writev, которые делают примерно то же, что и KNEM. См., Например, man7.org/linux/man-pages/man2/process_vm_readv.2. html - person janneb; 22.11.2012
comment
@janneb, спасибо, что указали на это, но ядра 3.x сейчас не очень популярны в большинстве производственных систем HPC. Тем не менее, KNEM предоставляет гораздо больше, чем просто передачу данных, например асинхронные операции, уведомления о завершении и т. д. - person Hristo Iliev; 22.11.2012
comment
Это правда, но опять же, ядра с патчем KNEM тоже не работают. - person janneb; 22.11.2012
comment
KNEM - это не патч. Вы можете собрать его на основе ядра, поставляемого с вашим дистрибутивом, а затем просто modprobe. Он совместим с любой версией ядра, начиная с 2.6.15. - person Hristo Iliev; 22.11.2012
comment
@Hristo lliev Привет, Христо Ильев, это так информативно, большое спасибо. Обязательно поищу KNEM. Я тоже приму это как ответ. А пока я оставляю все как есть, чтобы получить ответ и на свой второй вопрос. Благодарность :) - person LeTex; 22.11.2012
comment
@hankol, оба фреймворка, с которыми вы связались, по-видимому, основаны на потоках, а не на процессах. Многопоточные приложения совместно используют все свои данные в одном адресном пространстве и получают выгоду от таких вещей, как повторное использование кеша и гораздо более простые механизмы синхронизации. Для них совершенно нормально работать быстрее, чем типичная реализация MPI. Вот почему в настоящее время все более популярным становится гибридное программирование (смешивание MPI с потоками) - многопоточность на каждом узле, MPI между узлами. - person Hristo Iliev; 22.11.2012
comment
@Hristo lliev. большое спасибо за ваше время. Я признателен за вашу помощь (в том числе и по моим предыдущим вопросам, связанным с MPI) :) спасибо! - person LeTex; 22.11.2012
comment
@Hristo lliev. Я взглянул на Knem, похоже, это интересный модуль ядра. Одна вещь, которую я не понимаю, - это ее использование. В частности, правильные флаги, которые нужно использовать при запуске моей программы MPI. Что-то вроде --mca btl_sm_knem_dma_min 4860 достаточно, или мне нужно добавить еще флаг, например --mca btl_sm_eager_limit 4276 в том же прогоне? или не могли бы вы предложить мне хорошую ссылку на документацию об использовании флага Knem, я пытался осмотреться, но нет хорошей информации об этих сотрудниках. в противном случае я буду тестировать каждую команду с разными числовыми значениями каждый раз. Спасибо - person LeTex; 01.12.2012
comment
@hankol, к сожалению, я могу указать вам только на исходный код Open MPI. Документация скудная. Вы можете задать конкретные вопросы в списке рассылки пользователей Open MPI (или в список разработчиков - по сути, оба списка читают одни и те же люди). - person Hristo Iliev; 01.12.2012