用mpi4py实现并行函数映射

mpimap的Python项目详细描述


MPIMAP

这个包是mpi4py的包装器,允许在一台计算机或hpc集群的多个节点上并行运行函数。

当不使用mpi环境或只指定一个处理器时,用于实现mpimap方法的代码也将起作用。

设置

导入后,创建Mpimap类的实例:

mpi = mpimap.Mpimap()

要让每个进程打印其信息,请使用:

mpi.info()

此时,所有mpi实例仍继续处理正在运行的script.py中的所有行或发送给解释器的命令。若要将所有工作节点置于“侦听”状态,其中它们只接受从头进程发送的命令,请使用:

mpi.start()

从这里开始,运行的script.py中的命令或发送到解释器的命令将只由head进程处理。要确定每个工作进程启动后的状态,请使用:

mpi.status()

若要在完成后终止所有工作节点,请使用:

mpi.stop()

功能

要在每个工作节点“监听”作业后在其上运行代码,请将代码包含在不带参数的函数中,并使用:

mpi.run(func)

Mpimap包含一个map()函数,该函数的行为类似于python中包含的builtin版本:

output = mpi.map(func, args)

这将向所有工作节点发送函数的副本,然后将args列表排队,向当前未运行作业的每个节点发送值。输入顺序由输出保持。

Mpimap还包括功能gmap()。这是map()的一个特殊实例,用于运行一组作业,其中返回“failed”状态的参数将导致该组中的所有作业被取消:

output = mpi.gmap(func, args, groupind=0, failstate=None)

对于这个函数,args是一个列表列表。参数groupind确定函数运行的每个列表中的哪个条目用于确定该作业组。参数failstate是检查以确定作业是成功还是失败的值。

包含一个名为gmatrix的加法静态函数。这可用于生成两个列表的所有可能组合的列表,包括输入ID号,并将常量附加到所有组合:

x = [1, 2, 3]
y = [10, 20]
constants = ('a', 'b')
out = mpi.gmatrix(x, y, *constants)

此示例将返回:

>>> out
[('0', 1, 10, 'a', 'b'),
('1', 1, 20, 'a', 'b'),
('2', 2, 10, 'a', 'b'),
('3', 2, 20, 'a', 'b'),
('4', 3, 10, 'a', 'b'),
('5', 3, 20, 'a', 'b')]

示例

要测试提供的函数并检查builtin.map()mpimap.map()之间的处理时间差异,请运行示例python脚本:

mpirun -n <Number of processors you want to use> python example.py

完整的工作示例如下:

import mpimap
import time

def func_cheap(*args):
	"""Do nothing"""
	return


def func_expensive(n):
	"""Basic factorising problem"""
	factors = set([])
	for i in xrange(n - 1):
		i = i + 1
		# Skip factors
		if i in factors:
			continue
		# Find factors
		if n % i == 0:
			factors.add(i)
			factors.add(n / i)

	return sorted(factors)


# Build mpi
mpi = mpimap.Mpimap(sleep=0, debug=False)
mpi.info()
mpi.start()

# Run function on all nodes
mpi.run(func_cheap)

# Set up function and arguments
args = range(5000, 10000)

# Not in parallel
t0 = time.time()
res = map(func_expensive, args)
dt = time.time() - t0
print '\nNon Parallel: {}'.format(dt)

# Parallel
t0 = time.time()
res = mpi.map(func_expensive, args)
dt = time.time() - t0
print '\nParallel: {}\n'.format(dt)

mpi.stop()
mpi.exit()

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
使用jaxrpc的Java eclipse WebService客户端   java编程方式在对象上写入名称   java Spring批处理:重试后跳过   java Android错误:错误:任务执行失败:应用程序:transformClassesWithDexForDebug'   带有清单文件nullPointerException的java Android元数据   spring Java Quartz调度作业停止运行   JavaMockito:如何在不调用实际方法的情况下,模拟带有参数和无效返回类型的静态方法?   java Tomcat连接池问题无法在关闭的连接上调用方法   java如何交换列表中的项目?   java如何停止线程并通过Toast在线程中正确显示文本?   java为什么连续写入OutputStream时偏移量0不会导致重复字节?   java我无法生成头文件   不兼容的返回类型错误java   修改值后键值对的java Jolt转换规范   java有自动更新Javadoc的工具吗?   java线程如何在ints自身实例类中共享变量   java继承一个非gwt模块   java Hibernate xml配置   使用netty4异步调用的java链接HTTP请求响应