基本上,我有一个大对象,我想要执行一些功能,这非常适合并行处理。在这个例子中,我有一个大矩阵,我想计算列向量之间的所有成对内积。
请查看以下IPython Notebook。
我意识到在此上下文中不需要@interactive
装饰器,我尝试删除@require
装饰器,但其影响可以忽略不计。
我的问题是:有没有办法可以提高并行机器的性能?
我不知道map
方法的实现细节,我可以通过推送与视图中的引擎并行执行的函数来避免开销吗?但我无法想象它是随着每一个论点发送的。
自己对参数列表进行分区并编写一个用于远程使用的函数,这个函数看起来很傻。
我在四核机器上试用了笔记本,笔记本中的结果是用于双核机器。
答案 0 :(得分:1)
此处的主要性能问题是您应用的fortran-contiguous优化无法在网络传输中存活,因此引擎上的mat
是C连续的,而不是push
后的F连续。
你可以看到:
print mat.flags
%px print mat.flags
添加:
%px mat = numpy.asfortranarray(mat)
应该恢复你的表现(如笔记本的tweaked version所示)。
为了诊断这个问题,我尽力去找出瓶颈所在。对此有用的是AsyncResult.serial_time
和AsyncResult.wall_time
。当serial_time
很长时,这意味着该任务实际上需要在引擎上花费很长时间,而不是在IPython管道中花费大量时间。这让我觉得任务本身在引擎上很慢,所以我在一台引擎上远程完成了任务,
它仍然很慢(没有任何平行参与)。这是a notebook追踪问题。
旁注:
只有不交互式定义的函数(即模块函数,而不是笔记本中定义的函数)才需要@interactive
装饰器,因此在笔记本中它是多余的。