在Python中使用MPI进行图像处理

-1 投票
1 回答
1049 浏览
提问于 2025-04-18 05:46

我正在尝试使用MPI(mpi4py)在Python中进行一些图像处理。这是我目前的代码:

from mpi4py import MPI
from PIL import Image

comm = MPI.COMM_WORLD
size = comm.size #number of processors
rank = comm.rank #calling process rank
root = 0
if rank == 0:
    print "rank = 0 \n"
    img = Image.open('dog.jpg')
    width, height = img.size
    pix = list(img.getdata())
    for i in range(len(pix)):
        pix[i] = list(pix[i])
    chunks = [[] for _ in range(size)]
    for i, chunk in enumerate(pix):
        chunks[i % size].append(chunk)
else:
    print "rank != 0"

data = comm.scatter(chunks, root)
#do some pixel manipulations
data = comm.gather(data, root)
for i in range(len(pix)):
    pix[i] = tuple(data[0][i])
image = Image.new("RGB", (width, height))
image.putdata(pix)
image.save("test.jpg")

当我用

mpirun -np 1 python parallel.py

运行它时,一切正常。但是如果我尝试增加处理器的数量,就会出现以下错误:

mpirun -np 3 python parallel.py
rank = 1
rank = 2
rank = 0 

Traceback (most recent call last):
  File "parallel.py", line 21, in <module>
    data = comm.scatter(chunks, root)
NameError: name 'chunks' is not defined
Traceback (most recent call last):
  File "parallel.py", line 21, in <module>
    data = comm.scatter(chunks, root)
NameError: name 'chunks' is not defined

我是在使用Virtual Box的Ubuntu虚拟机上运行这段代码的。感谢你的帮助!

1 个回答

1

这不是一个MPI的问题。在那些执行了else:部分的进程中,chunks是没有定义的,也就是说,除了编号为0的进程,其他进程都没有这个变量。你只需要在那部分加上chunks = None就可以了:

...
if rank == 0:
    ...
else:
    print "rank != 0"
    chunks = None
...

如果只有一个进程的话就没问题,因为那时候只有一个编号(0),所以else部分根本不会被执行。

撰写回答