【问题标题】:Image manipulation in Python using MPI使用 MPI 在 Python 中进行图像处理
【发布时间】:2014-05-08 05:15:35
【问题描述】:

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

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 虚拟机上运行代码。 感谢您的帮助!

【问题讨论】:

    标签: python parallel-processing mpi mpi4py


    【解决方案1】:

    这不是 MPI 问题。 chunks 在采用条件的else: 分支的进程中未定义,即在除等级0 之外的所有进程中。只需在此处添加chunks = None

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

    它适用于一个进程,因为在这种情况下只有一个等级 (0),并且永远不会采用 else 分支。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-31
      • 1970-01-01
      • 1970-01-01
      • 2018-05-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多