MPI разделяет память с различными размерами окон в Фортране - PullRequest
3 голосов
/ 02 апреля 2019

Я пытаюсь принять мой код для использования общей памяти MPI.

Чтобы все было как можно проще, представьте, что у меня есть только два ядра. Ядру A нужен массив size_b от ядра b, а ядру b нужен массив size_a от ядра a

При выполнении на ядре A, Могу ли я сделать следующее?

 call MPI_WIN_ALLOCATE_SHARED(size_a_in_BYTES, disp_unit, MPI_INFO_NULL, comm_shm, ptr, win_a, mpierr)
 call C_F_pointer(ptr, fptr, (/size_a/))

и для сердечника B

 call MPI_WIN_ALLOCATE_SHARED(size_b_in_BYTES, disp_unit, MPI_INFO_NULL, comm_shm, ptr, win_b, mpierr)
 call C_F_pointer(ptr, fptrb, (/size_b/))

Теперь давайте предположим, что я впоследствии сообщу по MPI_SEND / RECV win_a и win_b соответственно ядру B и ядру a. Логика теперь состоит в том, чтобы сделать два запроса следующим образом

Core A:

        call MPI_WIN_SHARED_QUERY( win_b
 &                               , rank_of_core_B
 &                               , size_b
 &                               , disp_unit
 &                               , ptr_buf
 &                               , mpierr )
        call C_F_pointer(ptr_buf, fptr_query_A, (/size_b/))

и наоборот для активной зоны B

Допустим, я знаю, что в Core B мой указатель fptrb указывает на массив, т.е.

  fptrb = GIVEN_ARRAY_OF_SIZEB

Смогу ли я тогда извлечь память в CORE a, набрав fptr_query_A, например

   fptr_recv = fptr_query_A

где fptr_recv - указатель, объявленный в ядре A того же KIND, что и fptr_query_A

Я спрашиваю об этом, потому что из руководства не ясно, должна ли подпрограмма MPI_WIN_ALLOCATE_SHARED, помимо того, что она является коллективной для comm_shm, иметь одинаковый выигрыш и размер для всех ядер с общей памятью

Пожалуйста, отвечая, я думаю, что некоторые из моих недоразумений проистекают из следующего

1) При вызове MPI_WIN_ALLOCATE_SHARED я выделяю локальную память от вызывающего процессора для общей среды, то есть для общей группы связи.

1.a) Если да, то это означает, что каждый процессор объявляет, что он хочет поделиться, и с точки обзора получателя (процессора, который хочет получить доступ к совместно используемой памяти) он вызывает MPI_WIN_SHARED_QUERY, чтобы узнать, где в памяти процессор хранит свои общие данные?

Наконец, если эти два последних пункта в целом верны, я не уверен, что понимаю, как сделать вызов MPI_WIN_SHARED_QUERY.

Насколько я понимаю, MPI_WIN_SHARED_QUERY( win, rank, size,disp_unit, baseptr), что win - это окно любого ядра, которое мы хотим получить, аналогично для размера и ранга. По сути, это означает, что мне всегда нужно сообщать выигрыш и размер, чтобы сделать этот колл?

...