调整并行性能

时间:2013-02-18 12:37:50

标签: parallel-processing ipython

基本上,我有一个大对象,我想要执行一些功能,这非常适合并行处理。在这个例子中,我有一个大矩阵,我想计算列向量之间的所有成对内积。

请查看以下IPython Notebook

我意识到在此上下文中不需要@interactive装饰器,我尝试删除@require装饰器,但其影响可以忽略不计。

我的问题是:有没有办法可以提高并行机器的性能?

我不知道map方法的实现细节,我可以通过推送与视图中的引擎并行执行的函数来避免开销吗?但我无法想象它是随着每一个论点发送的。

自己对参数列表进行分区并编写一个用于远程使用的函数,这个函数看起来很傻。

我在四核机器上试用了笔记本,笔记本中的结果是用于双核机器。

1 个答案:

答案 0 :(得分:1)

此处的主要性能问题是您应用的fortran-contiguous优化无法在网络传输中存活,因此引擎上的mat是C连续的,而不是push后的F连续。

你可以看到:

print mat.flags
%px print mat.flags

添加:

%px mat = numpy.asfortranarray(mat)

应该恢复你的表现(如笔记本的tweaked version所示)。

为了诊断这个问题,我尽力去找出瓶颈所在。对此有用的是AsyncResult.serial_timeAsyncResult.wall_time。当serial_time很长时,这意味着该任务实际上需要在引擎上花费很长时间,而不是在IPython管道中花费大量时间。这让我觉得任务本身在引擎上很慢,所以我在一台引擎上远程完成了任务, 它仍然很慢(没有任何平行参与)。这是a notebook追踪问题。

旁注:

只有交互式定义的函数(即模块函数,而不是笔记本中定义的函数)才需要@interactive装饰器,因此在笔记本中它是多余的。