在非0 MPI列组上使用matplotlib会导致“QXcbConnection:无法连接到显示”

2024-09-26 17:40:39 发布

您现在位置:Python中文网/ 问答频道 /正文

在下面的代码中,我编写了一个程序,它使用mpi4py在秩0的节点中执行一些任务(生成数组)。然后在秩为1的节点中生成另一个数组。然后我绘制两个数组。节点0中的数组被广泛播送到节点1。但是代码给出了一个奇怪的错误。 我使用了以下命令:

mpiexec -n 2 -f mfile python mpi_test_4.py

程序如下:

^{pr2}$

错误消息是:

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

但是,当我在节点0上绘图时,这是我用来发出命令的节点:mpiexec-n2-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)

Tags: srchomefor节点npcompletionhydrawait
1条回答
网友
1楼 · 发布于 2024-09-26 17:40:39

这个错误一点也不奇怪。”“无法连接到显示”意味着某些东西无法执行某些图形操作。假设MPI进程可以在不同的计算节点上运行,您不能保证任何列组都可以这样做。根据this answer,您应该能够强制matplotlib使用不同的后端:

import matplotlib
matplotlib.use('Agg')

相关问题 更多 >

    热门问题