Я пытаюсь принять мой код для использования общей памяти 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
- это окно любого ядра, которое мы хотим получить, аналогично для размера и ранга.
По сути, это означает, что мне всегда нужно сообщать выигрыш и размер, чтобы сделать этот колл?