Мое приложение unix/windows С++ уже распараллеливается с использованием MPI: задание разбивается на N cpus, и каждый кусок выполняется параллельно, довольно эффективный, очень хороший масштабирование скорости, работа выполняется правильно.
Но некоторые данные повторяются в каждом процессе, и по техническим причинам эти данные не могут быть легко разделены на MPI (...). Например:
- 5 Gb статических данных, то же самое загружено для каждого процесса
- 4 Гб данных, которые могут быть распределены в MPI, чем больше процессоров используется, тем меньше это ОЗУ на процессор.
В четырехзадачном задании ЦП это означало бы, по крайней мере, нагрузку на 20 ГБ, большая часть памяти "впустую", это ужасно.
Я собираюсь использовать общую память для уменьшения общей нагрузки, "статический" кусок будет загружен только один раз на компьютер.
Итак, главный вопрос:
-
Есть ли какой-либо стандартный способ MPI для обмена памятью на node? Какой-нибудь доступный + бесплатный библиотека?
- Если нет, я бы использовал
boost.interprocess
и использовал вызовы MPI для распространения локальных идентификаторов разделяемой памяти. - Общая память будет считываться "локальным мастером" для каждого node и доступна только для чтения. Нет необходимости в каких-либо семафорах/синхронизации, потому что это не изменится.
- Если нет, я бы использовал
-
Любые проблемы с производительностью или особые проблемы, о которых нужно опасаться?
- (Там не будет никаких "строк" или слишком странных структур данных, все может быть сведено к массивам и указателям структуры).
-
Задача будет выполнена в системе очередности PBS (или SGE), в случае нечистого выхода процесса, я задаюсь вопросом, очистят ли они эту специальную разделяемую память node.