2017-01-30 3 views
-1

Я написал программу, которая использует mpi4py для выполнения некоторого задания (создания массива) в узле ранга 0 в следующем коде. Затем он создает другой массив в узле ранга 1. Затем я рисую оба массива. Массив в узле 0 широко применяется к узлу 1. Однако код дает странную ошибку. я использовал следующую команду:Использование matplotlib в отношении non-0 MPI rank вызывает «QXcbConnection: не удалось подключиться к отображению»

mpiexec -n 2 -f mfile python mpi_test_4.py 

Программа идет как:

from mpi4py import MPI 
import matplotlib.pyplot as plt 
import numpy as np 

comm = MPI.COMM_WORLD 
rank = comm.rank 


x = np.linspace(-2*np.pi,2*np.pi,100) 
if (rank == 0): 
    y1 = np.sin(x) 
else: 
    y1 = None 
y1 = comm.bcast(y1,root=0) 
if (rank == 1): 
    y2 = np.cos(x) 
    fig = plt.figure() 
    ax = fig.gca() 
    ax.plot(x,y1) 
    ax.plot(x,y2) 
    plt.savefig('test.png') 

print(rank) 

сообщение об ошибке:

0 
QXcbConnection: Could not connect to display 

=================================================================================== 
= BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES 
= PID 6804 RUNNING AT 192.168.1.106 
= EXIT CODE: 134 
= CLEANING UP REMAINING PROCESSES 
= YOU CAN IGNORE THE BELOW CLEANUP MESSAGES 
=================================================================================== 
[proxy:0:[email protected]] HYD_pmcd_pmip_control_cmd_cb (/home/alankar/mpich3/mpich-3.2/src/pm/hydra/pm/pmiserv/pmip_cb.c:885): assert (!closed) failed 
[proxy:0:[email protected]] HYDT_dmxu_poll_wait_for_event (/home/alankar/mpich3/mpich-3.2/src/pm/hydra/tools/demux/demux_poll.c:76): callback returned error status 
[proxy:0:[email protected]] main (/home/alankar/mpich3/mpich-3.2/src/pm/hydra/pm/pmiserv/pmip.c:206): demux engine error waiting for event 
[[email protected]] HYDT_bscu_wait_for_completion (/home/alankar/mpich3/mpich-3.2/src/pm/hydra/tools/bootstrap/utils/bscu_wait.c:76): one of the processes terminated badly; aborting 
[[email protected]] HYDT_bsci_wait_for_completion (/home/alankar/mpich3/mpich-3.2/src/pm/hydra/tools/bootstrap/src/bsci_wait.c:23): launcher returned error waiting for completion 
[[email protected]] HYD_pmci_wait_for_completion (/home/alankar/mpich3/mpich-3.2/src/pm/hydra/pm/pmiserv/pmiserv_pmci.c:218): launcher returned error waiting for completion 
[[email protected]] main (/home/alankar/mpich3/mpich-3.2/src/pm/hydra/ui/mpich/mpiexec.c:344): process manager error waiting for completion 

Однако, когда я сюжет на узле 0, который является узлом Я используя команду: mpiexec -n 2 -f mfile python mpi_test_4.py работает код. Например:

from mpi4py import MPI 
import matplotlib.pyplot as plt 
import numpy as np 

comm = MPI.COMM_WORLD 
rank = comm.rank 


x = np.linspace(-2*np.pi,2*np.pi,100) 
if (rank == 1): 
    y1 = np.sin(x) 
else: 
    y1 = None 
y1 = comm.bcast(y1,root=1) 
if (rank == 0): 
    y2 = np.cos(x) 
    fig = plt.figure() 
    ax = fig.gca() 
    ax.plot(x,y1) 
    ax.plot(x,y2) 
    plt.savefig('test.png') 

print(rank) 
+1

Вы продолжаете редактировать свой вопрос, изменяя код, который вызывает каждую ошибку, прежде чем кто-то еще может ответить объяснить, что происходит. У вас все еще есть настоящая «странная ошибка» или вы уже все это исправили? – Blckknght

+0

@Blckknght все еще с этим –

+0

Привет @AlankarDutta, откуда «ранга»? –

ответ

0

Эта ошибка ни в коем случае не причудлива. «Не удалось подключиться к дисплею» означает, что что-то не может выполнить некоторые графические материалы. Учитывая, что процессы MPI могут выполняться на отдельных вычислительных узлах, у вас нет гарантии, что любой ранг может это сделать. Согласно this answer, вы должны быть в состоянии заставить Matplotlib в использовании другого бэкенд:

import matplotlib 
matplotlib.use('Agg')