-1

I have written a program that uses mpi4py to do some job (making an array) in the node of rank 0 in the following code. Then it makes another array in the node of rank 1. Then I plot both the arrays. The array in node 0 is broad casted to node 1. However the code gives a bizarre error. I used the following command:

mpiexec -n 2 -f mfile python mpi_test_4.py

The program goes as:

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)

Error message is:

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:0@alankar-Aspire-E5-571] 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:0@alankar-Aspire-E5-571] 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:0@alankar-Aspire-E5-571] main (/home/alankar/mpich3/mpich-3.2/src/pm/hydra/pm/pmiserv/pmip.c:206): demux engine error waiting for event
[mpiexec@alankar-Aspire-E5-571] 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
[mpiexec@alankar-Aspire-E5-571] 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
[mpiexec@alankar-Aspire-E5-571] 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
[mpiexec@alankar-Aspire-E5-571] main (/home/alankar/mpich3/mpich-3.2/src/pm/hydra/ui/mpich/mpiexec.c:344): process manager error waiting for completion

However when I plot on node 0 which is the node I am using to issue the command: mpiexec -n 2 -f mfile python mpi_test_4.py the code works. For example this:

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)
Zulan
  • 21,896
  • 6
  • 49
  • 109

1 Answers1

0

This error is by no means bizarre. "Could not connect to display" means that something fails to do some graphics stuff. Given that MPI processes can run on separate compute nodes, you have no guarantee that any rank can do just that. According to this answer, you should be able to force matplotlib into using a different backend:

import matplotlib
matplotlib.use('Agg')
Community
  • 1
  • 1
Zulan
  • 21,896
  • 6
  • 49
  • 109