2013-02-18 76 views
0

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

请看下面的IPython Notebook

我意识到@interactive装饰是没有必要在这种情况下,我试图消除@require装饰,但其影响可以忽略不计。

我的问题是:有什么方法可以改善并联机器的性能吗?

我不知道map方法的实现细节,我可以通过推动与视图中的引擎并行执行的函数来避免开销吗?尽管如此,我无法想象它会随每个参数一起发送。

将自变量列表自己分块并编写远程使用的函数,该函数似乎也很愚蠢。

我试过四核心机器上的笔记本电脑,笔记本电脑的结果是两个核心机器。

回答

1

此处的主要性能问题是,您应用的Fortran连续优化不能在网络传输中存活,因此引擎上的matpush之后是C连续的,而不是F连续的。

print mat.flags 
%px print mat.flags 

添加:

你可以看到这个

%px mat = numpy.asfortranarray(mat) 

应该把你的性能恢复(在我的笔记本电脑的tweaked version所示)。

为了诊断这个问题,我尽了最大努力来隔离瓶颈。对此有用的是和AsyncResult.wall_time。当serial_time很长时,这意味着该任务实际上在引擎上花费很长时间,而不是花费大量时间在IPython管道中。这导致我认为任务本身在引擎上很慢,所以我在一个引擎上远程执行任务,并且它仍然很慢(没有任何并行参与)。这里的a notebook追查问题。

旁注:

@interactive装饰,只需要对那些交互方式定义(即模块的功能,在笔记本定义不是函数)的功能,所以它是在你的笔记本是多余的。

+0

太棒了,谢谢你的时间和精力。我甚至没有想到内存布局可能会改变。 – Midnighter 2013-02-19 19:19:36

+0

对于数组的零拷贝发送,IPython要求它们是连续的。为此,IPython使用'ascontiguousarray',它实际上最终将F连续数组强制转换为C连续数组,尽管它可能不需要(它可能*有时*,取决于切片)。我将研究在F-contiguous数组的零拷贝发送中会涉及哪些内容以避免这种奇怪的情况。 – minrk 2013-02-19 20:43:54