Мое приложение unix/windows C++ уже распараллелено с использованием MPI: задание разделено на N процессоров, и каждый фрагмент выполняется параллельно, достаточно эффективно, очень хорошее масштабирование скорости, задание выполняется правильно.
Но некоторые данные повторяются в каждом процессе, и по техническим причинам эти данные не могут быть легко разделены по MPI (...). Например:
- 5 ГБ статических данных, одно и то же загружается для каждого процесса
- 4 ГБ данных, которые могут быть распределены в MPI, чем больше процессоров используется, тем меньше эта оперативная память на каждый процессор.
При работе с 4 ЦП это будет означать загрузку ОЗУ не менее 20 ГБ, большая часть памяти «пропадает впустую», это ужасно.
Я думаю, что при использовании общей памяти для снижения общей нагрузки «статический» фрагмент будет загружаться только один раз на компьютер.
Итак, главный вопрос:
Есть ли какой-либо стандартный способ MPI для совместного использования памяти на узле? Какая-то легкодоступная + бесплатная библиотека?
- If not, I would use
boost.interprocess
and use MPI calls to distribute local shared memory identifiers. - Общая память будет считываться «локальным мастером» на каждом узле и доступна только для чтения. Нет необходимости в каком-либо семафоре/синхронизации, потому что он не изменится.
- If not, I would use
Есть ли какие-либо проблемы с производительностью или особые проблемы, на которые следует обратить внимание?
- (There wont be any "strings" or overly weird data structures, everything can be brought down to arrays and structure pointers)
Задание будет выполняться в системе очередей PBS (или SGE), в случае нечистого выхода процесса, интересно, очистят ли они разделяемую память, специфичную для узла.