在Python中运行大容量同步并行模型(BSP)
BSP并行编程模型有几个好处——程序员不需要特别关注同步问题,死锁的情况也变得不可能出现,而且在速度方面的推理比传统方法简单得多。在SciPy中,有一个Python接口可以使用BSPlib:
import Scientific.BSP
我写了一个小程序来测试BSP。这个程序是一个简单的随机实验,它“计算”投掷n
个骰子得到总和为k
的概率:
from Scientific.BSP import ParSequence, ParFunction, ParRootFunction
from sys import argv
from random import randint
n = int(argv[1]) ; m = int(argv[2]) ; k = int(argv[3])
def sumWuerfe(ws): return len([w for w in ws if sum(w)==k])
glb_sumWuerfe= ParFunction(sumWuerfe)
def ausgabe(result): print float(result)/len(wuerfe)
glb_ausgabe = ParRootFunction(output)
wuerfe = [[randint(1,6) for _ in range(n)] for _ in range(m)]
glb_wuerfe = ParSequence(wuerfe)
# The parallel calc:
ergs = glb_sumWuerfe(glb_wuerfe)
# collecting the results in Processor 0:
ergsGesamt= results.reduce(lambda x,y:x+y, 0)
glb_output(ergsGesamt)
这个程序运行得很好,但它只使用了一个进程!
我的问题:有没有人知道怎么让这个Python-BSP脚本使用4个(或者8个、16个)进程?我以为这个BSP实现会使用MPI,但通过mpiexe -n 4 randExp.py
启动脚本并不成功。
1 个回答
这是一件小事,但在你的问题中,Scientific Python 和 SciPy 是不一样的……
如果你下载了 ScientificPython 的源代码,你会看到有几个文件:README.BSP、README.MPI 和 README.BSPlib。可惜的是,网上的页面上并没有详细提到这些信息。
README.BSP 文件里很清楚地告诉你,想要在真正的并行环境中使用 BSP 的功能,你需要做些什么:
为了在多个真实处理器上使用模块 Scientific.BSP,你必须编译 BSPlib 或 MPI 接口。具体的安装细节请查看 README.BSPlib 和 README.MPI。BSPlib 接口可能更高效(我还没有做过详细测试),并且可以使用 BSP 工具集;而 MPI 更广泛可用,可能已经在你的机器上安装好了。对于认真使用,建议你安装这两者,并根据自己的应用进行比较。应用程序不需要修改就可以在 MPI 和 BSPlib 之间切换,唯一需要调整的是在多处理器机器上运行程序的方法。
要以并行模式执行程序,使用 mpipython 或 bsppython 可执行文件。你的 MPI 或 BSPlib 安装手册会告诉你如何定义处理器的数量。
而 README.MPI 则告诉你如何获得 MPI 支持:
要在 Scientific Python 中获得 MPI 支持,你需要做以下几步:
1) 像往常一样构建并安装 Scientific Python(大多数情况下就是运行 "python setup.py install")。
2) 进入 Src/MPI 目录。
3) 输入 "python compile.py"。
4) 将生成的可执行文件 "mpipython" 移动到你系统的执行路径中的某个目录。
所以,你需要明确地构建更多的 BSP 内容,以利用真正的并行处理。好消息是,你不需要更改你的程序。原因是不同的系统安装了不同的并行库,而在这些库之上构建的库需要像这样进行配置和构建,以便利用可用的资源。