2016-12-05 18 views
0

Я хочу создать топологию без 0 процессора в ней. Моя идея - сделать процессор 0 ведущим и создать топологию как подчиненную. После определенной топологии вычисления sin, я пошлю данные на мастер. Вот мой код:использовать mpi_cart_create с мастером и ведомым

 include "mpif.h" 

     integer maxn 

     integer myid,Root,numprocs,numtasks,taskid 
     integer comm2d, ierr 
     integer dims(2) 
     logical periods(2) 
     data periods/2*.false./ 
    Root = 0 
     CALL MPI_INIT(ierr) 
     CALL MPI_COMM_RANK(MPI_COMM_WORLD, myid, ierr) 
     CALL MPI_COMM_SIZE(MPI_COMM_WORLD, numprocs, ierr) 
     numtasks = numprocs-1 
     if(myid .eq. Root) then 
     print *, 'Hello I am master' 
     endif 
c Get a new communicator for a decomposition of the domain. 
c Let MPI find a "good" decomposition 
     dims(1) = 0 
     dims(2) = 0 
     CALL MPI_DIMS_CREATE(numtasks,2,dims,ierr) 
     CALL MPI_CART_CREATE(MPI_COMM_WORLD,2,dims,periods,.true., 
    *     comm2d,ierr) 
c Get my position in this communicator 
     CALL MPI_COMM_RANK(comm2d, taskid, ierr)   
c 
    print *, 'task ID= ',taskid 
    if (myid .eq. master) then 
     print *,dims(1),dims(2) 
    endif 
     CALL MPI_Comm_free(comm2d, ierr) 

30 CALL MPI_FINALIZE(ierr) 

     STOP 
     END 

Но, когда я пробегаю над кодом; Я получаю следующую ошибку.

Фатальная ошибка в PMPI_Comm_rank: Invalid коммуникатор, стек ошибка: PMPI_Comm_rank (121): MPI_Comm_rank (MPI_COMM_NULL, ранг = 0x7fff08bf960c) не удалось PMPI_Comm_rank (73) .: Null коммуникатор

Как я могу устранить ошибку? Что я делаю неправильно.

+0

Я думаю, я редактировал его сейчас .. –

+1

Любую причину для разработки нового кода в 2016 году с использованием стандартных Fortran77? – Gilles

+0

@ Gilles не совсем учит MPI, он выбран из учебника. –

ответ

2

Вы начинаете работу с MPI с помощью процессов numprocs. Затем вы создаете декартову топологию с процессами numtasks = numprocs-1. Поэтому один из процессов заканчивается тем, что он не является частью декартового коммуникатора и принимает MPI_COMM_NULL в comm2d. Вызов MPI_COMM_RANK с нулевым коммуникатором - ошибка. Решение состоит в том, чтобы исправить код, чтобы проверить первое значение comm2d:

CALL MPI_CART_CREATE(MPI_COMM_WORLD,2,dims,periods,.true., 
*      comm2d,ierr) 
IF (comm2d.NE.MPI_COMM_NULL) THEN 
    ... 
ENDIF 
+0

Спасибо, что ответ Хрито, я верну завтра. –

+0

Да, сейчас он работает. Процессоры корзины имеют ранги от 0 до numtasks ... Как я могу обрабатывать здесь вычисления и отправлять данные в подчиненный, чей ранг равен нулю. Поскольку ранг 0 повторяется дважды; Это подтолкнуло меня к еще одному сомнению. –

+0

Ранг 0 в декартовом коммуникаторе имеет разное ранг в 'MPI_COMM_WORLD'. Мастер-процесс не может отправлять сообщения в 'comm2d' в любом случае, так как он не является членом коммуникатора. –