Стандарт MPI-3 представляет общую память, которая может быть прочитана и записана всеми процессами, разделяющими эту память, без использования обращений к библиотеке MPI. Хотя есть примеры одностороннего обмена данными с использованием разделяемой или не разделяемой памяти, я не нашел много информации о том, как правильно использовать разделяемую память с прямым доступом.
Я закончил тем, что сделал что-то подобное, что работает хорошо, но мне было интересно, гарантирует ли стандарт MPI, что он всегда будет работать?
// initialization:
MPI_Comm comm_shared;
MPI_Comm_split_type(MPI_COMM_WORLD, MPI_COMM_TYPE_SHARED, i_mpi, MPI_INFO_NULL, &comm_shared);
// allocation
const int N_WIN=10;
const int mem_size = 1000*1000;
double* mem[10];
MPI_Win win[N_WIN];
for (int i=0; i<N_WIN; i++) { // I need several buffers.
MPI_Win_allocate_shared( mem_size, sizeof(double), MPI_INFO_NULL, comm_shared, &mem[i], &win[i] );
MPI_Win_lock_all(0, win);
}
while(1) {
MPI_Barrier(comm_shared);
... // write anywhere on shared memory
MPI_Barrier(comm_shared);
... // read on shared memory written by other processes
}
// deallocation
for (int i=0; i<N_WIN; i++) {
MPI_Win_unlock_all(win[i]);
MPI_Win_free(&win[i]);
}
Здесь я обеспечиваю синхронизацию с помощью MPI_Barrier()
и предполагаю, что аппаратное обеспечение обеспечивает согласованность представления памяти. Кроме того, поскольку у меня есть несколько общих windows, один вызов MPI_Barrier кажется более эффективным, чем вызов MPI_Win_fence()
в каждом окне общей памяти.
Кажется, он хорошо работает на моих ноутбуках и серверах x86. Но является ли эта программа действительной / правильной программой MPI? Есть ли более эффективный метод достижения того же самого?