2016-12-05 2 views
0

Je veux créer une topologie sans processeur 0 dedans. Mon idée est de faire du processeur 0 un maître et de créer une topologie en tant qu'esclave. Après certains calculs de topologie sin, je vais envoyer des données au maître. Voici mon code:utilise mpi_cart_create avec master et slave

 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 

Mais, quand je cours au-dessus du code; Je reçois l'erreur suivante.

Erreur fatale PMPI_Comm_rank: communicateur non valide, la pile d'erreur: PMPI_Comm_rank (121): MPI_Comm_rank (MPI_COMM_NULL, rang = 0x7fff08bf960c) n'a pas PMPI_Comm_rank (73) .: communicateur nul

Comment puis-je éliminer l'erreur? Qu'est ce que je fais mal.

+0

Je pense, je l'ai modifié maintenant .. –

+1

Quel est le motif de développer un nouveau code en 2016 en utilisant la norme Fortran77? – Gilles

+0

@ Gilles n'apprenant pas exactement MPI il est choisi dans un tutoriel. –

Répondre

2

Vous démarrez votre travail MPI avec les processus numprocs. Ensuite, vous créez une topologie cartésienne avec les processus numtasks = numprocs-1. Par conséquent, l'un des processus finit par ne pas faire partie du communicateur cartésien et reçoit MPI_COMM_NULL en comm2d. L'appel MPI_COMM_RANK avec un communicateur null est une erreur. La solution est de fixer votre code d'abord vérifier la valeur de comm2d:

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

Merci pour la réponse Hristo, je vais donner des feed-back demain. –

+0

oui ça marche maintenant. Les processeurs de panier ont des rangs de 0 à numtasks. Comment puis-je gérer pour exécuter des calculs ici et envoyer des données à l'esclave dont le rang est zéro. Comme le rang 0 se répète deux fois; Cela m'a poussé dans un doute de plus. –

+0

Le rang 0 dans le communicateur cartésien a un rang différent dans 'MPI_COMM_WORLD'. Le processus maître ne peut quand même pas envoyer de messages dans 'comm2d' car il n'est pas membre du communicateur. –