Я не работал с MPI, но если это похоже на другие библиотеки IPC, которые я видел, которые скрывают, находятся ли другие потоки / процессы / что-либо на одном и том же или разных компьютерах, то он не сможет гарантировать совместную память , Да, он может обрабатывать разделяемую память между двумя узлами на одной машине, если эта машина сама предоставила разделяемую память. Но попытка разделить память между узлами на разных машинах в лучшем случае была бы очень сложной из-за сложных проблем, связанных с согласованностью. Я ожидаю, что это просто не будет реализовано.
С практической точки зрения, если вам нужно разделить память между узлами, лучше всего делать это вне MPI. я не думаю, что вам нужно использовать разделяемую память в стиле boost.interprocess
, поскольку вы не описываете ситуацию, когда разные узлы вносят детальные изменения в разделяемую память; он доступен только для чтения или разбит на разделы.
Ответы Джона и Деуса охватывают, как отобразить в файле, что, безусловно, вы хотите сделать для статических данных 5 Гб (гига бит ?). Данные для каждого процессора звучат как одно и то же, и вам просто нужно отправить сообщение каждому узлу, сообщающее, какую часть файла он должен получить. ОС должна позаботиться о сопоставлении виртуальной памяти с физической памятью с файлами.
Что касается очистки ... Я бы предположил, что она не выполняет никакой очистки общей памяти, но mmap
ed-файлы должны быть очищены, так как файлы закрываются (что должно освободить их отображения памяти), когда очищается процесс вверх. Я понятия не имею, что предостережения CreateFileMapping
и т. Д. Имеют
Фактическая «разделяемая память» (т. Е. boost.interprocess
) не очищается, когда процесс умирает. Если возможно, я бы порекомендовал попробовать убить процесс и посмотреть, что осталось позади.