2016-02-21 5 views
1

J'écris un morceau de code qui va inverser une matrice avec l'utilisation de mpi4py. Je reçois une erreur qui me cause des problèmes. J'ai mis 2 variables par défaut m, n et l'utilisateur insère les nombres dans le processus rank 0 pour remplir la matrice. Le processus rank 0 envoie la matrice aux process 1 et process 2. Dans process 1 j'initialiser la matrice et le déterminant, calculer le déterminant, et le renvoyer à rank 0. Dans process 2, j'initialise la matrice, trouve la matrice inverse et renvoie la matrice inverse au processus 0.matrice inverse Python3 mpi4py EOFError: EOF lors de la lecture d'une ligne

En process 0 Je reçois alors le déterminant et la matrice inverse. Si le déterminant est 0, un message sera envoyé et le programme sortira (la matrice inverse peut être calculée même si le déterminant est 0, mais ce n'est pas correct). Si ce n'est pas 0, le programme imprimera la matrice inverse. Notez que je sais que la mise en œuvre actuelle n'est pas la meilleure façon de paralléliser ce problème, mais je devais partir de quelque part. Le déterminant m'a donné quelques erreurs, donc je l'ai initialisé comme un tableau vide de numpy de 2 éléments, où le premier élément est le déterminant et le second est 0. J'ai édité le code un peu de ma langue maternelle vers l'anglais il pourrait être lu et compris plus facilement, donc il peut contenir quelques erreurs.

Le problème est que lorsque je veux donner à l'utilisateur le privilège d'écrire la taille de la matrice. J'ai vérifié certaines réponses connexes, et j'ai essayé d'utiliser map(), raw_input(), et d'autres options, mais aucune n'a fonctionné.

Le code:

import numpy as np 
from numpy.linalg import inv 
from scipy.linalg import det 
from mpi4py import MPI 



comm = MPI.COMM_WORLD 
rank = comm.Get_rank() 
size = comm.Get_size() 

m = int(input()) 
n = int(input()) 

if rank==0: 
    matrix = np.zeros((m,n)) 
    determinant = np.zeros((2)) 
    for i in range (0,m): 
     for j in range(0,n): 
      print("Enter the value for the field: m = ", i+1, ", n = ", j+1,"\n") 
      matrix[i][j] = float(input()) 

    comm.Send(matrix, dest=1, tag=0) 
    comm.Send(matrix, dest=2, tag=0) 
    comm.Recv(determinant, source=1, tag=0) 
    comm.Recv(matrix, source=2, tag=0) 
    if(determinant[0]==0): 
     print("There is no inverse matrix since the determinant is 0!") 
    else: 
     print("Inverse matrix:\n",matrica) 
elif rank==1: 
    matrix = np.zeros((m,n)) 
    determinant = np.zeros((2)) 
    comm.Recv(matrix, source=0, tag=0) 
    determinant = np.array([[det(matrix)],[0]]) 
    comm.Send(determinant, dest=0) 
elif rank==2: 
    matrix = np.zeros((m,n)) 
    comm.Recv(matrix, source=0, tag=0) 
    matrix = inv(matrix) 
    comm.Send(matrix, dest=0) 
else: 
    exit() 

L'erreur:

Traceback (most recent call last): 
    File "lambda.py", line 13, in <module> 
    m = int(input()) 
EOFError: EOF when reading a line 
Traceback (most recent call last): 
    File "lambda.py", line 13, in <module> 
    m = int(input()) 
EOFError: EOF when reading a line 

EDIT: J'utilise PuTTY pour se connecter à un système d'exploitation Debian de l'université.

version Interprète: sys.version_info (majeur = 3, mineur = 5, micro = 1, releaselevel = 'finale', série = 0)

j'entre la ligne de commande: mpirun -np 3 python3 lambda. py, je reçois un EOFError et insérer les chiffres jusqu'à ce que le point où il doit faire quelque chose, quand, au lieu de le faire, il continue de fonctionner comme une boucle infinie. (mieux visible sur la photo) Picture

Ajouté le code pour tracer l'entrée:

m = int(input("Enter number of rows, m = \n")) 
n = int(input("Enter number of columns, n = \n")) 

Picture 2

+0

Vous mentionnez que vous avez modifié le code de votre langue maternelle à l'anglais. Pourriez-vous s'il vous plaît tester le code révisé et confirmer qu'il se comporte comme votre code natif? Sinon, il ne sert à rien de résoudre le problème. – mech

+0

Comment exécutez-vous réellement le code? Êtes-vous sûr que c'est Python3. –

+0

@MarcoBubi, pourriez-vous s'il vous plaît exécuter ce qui suit soit dans votre interprète, ou enregistrez-le dans un fichier python, exécutez-le, et dites-nous le résultat? Il doit nous indiquer la version de votre interpréteur: 'import sys; print (sys.version_info)' – mech

Répondre

0

Votre problème n'a rien à voir avec des matrices: il est que votre ligne

m = int(input()) 

se passe sur tous les nœuds. Vous devez le faire sur le nœud racine, puis partager les résultats comme vous le souhaitez, par exemple avec une diffusion.Par exemple, si nous commençons par

from mpi4py import MPI 

x = input("enter x: ") 

nous obtenons

(3.5) [email protected]:~/coding/mpipar$ mpirun -np 3 python m1.py 
enter x: enter x: Traceback (most recent call last): 
    File "m1.py", line 3, in <module> 
    x = input("enter x: ") 
EOFError: EOF when reading a line 
enter x: Traceback (most recent call last): 
    File "m1.py", line 3, in <module> 
    x = input("enter x: ") 
EOFError: EOF when reading a line 

et noter qu'il ya deux erreurs. Mais si nous protégeons:

from mpi4py import MPI 

comm = MPI.COMM_WORLD 
rank = comm.Get_rank() 

x = None 
if rank == 0: 
    x = input("enter x: ") 

x = comm.bcast(x, root=0) 

print("rank", rank, "thinks x is", x) 

alors nous obtenons

(3.5) [email protected]:~/coding/mpipar$ mpirun -np 3 python m2.py 
enter x: abc 
rank 0 thinks x is abc 
rank 1 thinks x is abc 
rank 2 thinks x is abc 
+0

Oui, ça marche! Merci! Je savais que ça devait être fait comme ça, je n'avais aucune idée de comment, plutôt nouveau sur python. Je suppose que j'ai besoin de vérifier les docs un peu plus. : P – MarcoBubi