Я использую MPI в fortran для вычисления моих данных. Я проверял, распечатывая данные, что вычисления выполняются по желаемому звонку каждым процессом просто отлично, но мастер не может сопоставить данные.Мастер MPI не смог принять
Вот код, который я пытаюсь сделать его работу: EDIT: Созданный тег, который является постоянным для отправки и RECV
integer :: tag
tag = 123
if(pid.ne.0) then
print *,'pid: ',pid,'sending'
DO j = start_index+1, end_index
CALL MPI_SEND(datapacket(j),1, MPI_REAL,0, tag, MPI_COMM_WORLD)
!print *,'sending'
END DO
print *,'send complete'
else
DO slave_id = 1, npe-1
rec_start_index = slave_id*population_size+1
rec_end_index = (slave_id + 1) * population_size;
IF (slave_id == npe-1) THEN
rec_end_index = total-1;
ENDIF
print *,'received 1',rec_start_index,rec_end_index
CALL MPI_RECV(datapacket(j),1,MPI_REAL,slave_id,tag,MPI_COMM_WORLD, &
& status)
!print *,'received 2',rec_start_index,rec_end_index
END DO
Он никогда не печатает received
или что-нибудь после MPI_RECV
вызова, но, Я вижу, что отправка происходит просто отлично, но я не могу проверить ее, кроме как полагаться на утверждения печати. Переменная databpacket
инициализируется следующим образом:
real, dimension (:), allocatable :: datapacket
Есть ли то, что я делаю неправильно здесь?
EDIT: для тестовой настройки весь процесс запускается на локальном хосте.
Спасибо, я сделаю к сведению MPI_Gather и попробовать его позже. В текущем контексте отправка и получение постоянного тега не помогла. Я отредактировал свою текущую реализацию. – Trancey
Я обновил свой ответ и попытался что-то придумать, я думаю, что вы пытаетесь достичь. Тем не менее я настоятельно рекомендую вам посмотреть MPI_Gather/MPI_Gatherv. – haraldkl