Освобождение окна MPI, обеспечивающего доступ к разделяемой памяти без выполнения барьерной синхронизации - PullRequest
0 голосов
/ 13 июля 2020

Я хочу освободить разделяемую память MPI, но использование «MPI_Win_free» для освобождения окна памяти и присоединенной общей памяти требует синхронизации барьера внутри «MPI_Win_free».

Синхронизация барьера означает, что процессы будут ждать друг на друга. Это проблема c, если вам нужно реализовать деструктор для объекта C ++, который управляет общей памятью, и использовать его в python, где сборка мусора такого объекта может привести к тому, что некоторый процесс MPI ожидает освобождения общей памяти. в то время как другие могут уже ждать в коллективном вызове. Следовательно, программа зависнет.

Пример выделения и освобождения разделяемой памяти MPI:

    int world_rank;
    MPI_Comm_rank (MPI_COMM_WORLD, &world_rank);

    MPI_Comm communicator;
    MPI_Comm_split_type(
        MPI_COMM_WORLD,
        MPI_COMM_TYPE_SHARED,
        world_rank,
        MPI_INFO_NULL,
        &communicator);

    MPI_Info window_info;
    MPI_Info_create(&window_info);
    MPI_Info_set(window_info, "no_locks", "true");

    double * local_allocated_mem_ptr;

    MPI_Win shared_mem_win;

    // The master process of the communicator should allocate all the
    // shared memory.
    if (world_rank == 0)
    {
        int const size = 5;
        MPI_Aint local_allocated_mem_size = size * sizeof(double);
        MPI_Win_allocate_shared(
           local_allocated_mem_size,
           sizeof(double),
           window_info,
           communicator,
           &local_allocated_mem_ptr,
           &shared_mem_win);
    }
    else
    {
        MPI_Aint local_allocated_mem_size = 0;
        MPI_Win_allocate_shared(
            local_allocated_mem_size,
            sizeof(double),
            window_info,
            communicator,
            &local_allocated_mem_ptr,
            &shared_mem_win);
    }

    MPI_Info_free(&window_info);

    // Deallocate the shared memory again.
    // The MPI_Win_free function includes a synchronization barrier that I want to skip.
    MPI_Win_free(&shared_mem_win);

Согласно документации «можно» избежать барьерной синхронизации в «MPI_Win_free», установив параметр MPI_Info ключ 'no_locks' к 'true', как описано здесь:

https://www.mpi-forum.org/docs/mpi-3.1/mpi31-report/node265.htm

MPI_WIN_FREE требует синхронизации барьера: ни один процесс не может вернуться из бесплатного до все процессы в группе win звонят бесплатно. Это гарантирует, что ни один процесс не будет пытаться получить доступ к удаленному окну (например, с блокировкой / разблокировкой) после его освобождения. Единственное исключение из этого правила - когда пользователь устанавливает для информационного ключа no_locks значение true при создании окна. В этом случае реализация MPI может освободить локальное окно без барьерной синхронизации.

и здесь:

https://books.google.de/books?id=Po5IBQAAQBAJ&pg=PA95&lpg=PA95&dq=MPI_Info_set+%22no_locks%22&source=bl&ots=Da5hS0HIRg&sig=ACfU3U0SzRto57L4XL41fiO1Db3Pzg2Ctw&hl=en&sa=X&ved=2ahUKEwivzpKeusLqAhVVwMQBHSNPCMgQ6AEwAHoECAoQAQ#v = onepage & q = MPI_Info_set% 20% 22no_locks% 22 & f = false

В приведенном выше примере также показан этот подход, но он не действует, поскольку все еще существует барьер. Так есть ли альтернативный способ освобождения разделяемой памяти, при котором гарантированно не будет барьерной синхронизации?

...