0

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

请看下面的IPython Notebook

我意识到@interactive在这种情况下不需要装饰器,我尝试删除@require装饰器,但它的影响可以忽略不计。

我的问题是:有什么方法可以提高并行机器的性能吗?

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

我自己将参数列表分块并编写一个远程使用的函数似乎也很愚蠢。

我在四核机器上尝试了笔记本,笔记本中的结果是两核机器。

4

1 回答 1

1

这里的主要性能问题是您应用的 fortran-contiguous 优化无法在网络传输中存活,因此mat引擎是 C-contiguous,而不是push.

你可以看到这个:

print mat.flags
%px print mat.flags

添加:

%px mat = numpy.asfortranarray(mat)

应该让你的表现恢复(如我的笔记本调整版所示)。

为了诊断这个问题,我尽我所能找出瓶颈所在。对此有用的是AsyncResult.serial_timeand AsyncResult.wall_time。当它很长时,这意味着该任务实际上在引擎上serial_time花费了很长时间,而不是在 IPython 管道中花费大量时间。这让我认为任务本身在引擎上很慢,所以我在一个引擎上远程完成了任务,它仍然很慢(不涉及并行)。这是一个跟踪问题的笔记本。

边注:

@interactive装饰器仅对交互定义的函数(即模块函数,而不是笔记本中定义的函数)是必需的,因此它在你的笔记本中是多余的。

于 2013-02-19T02:58:30.903 回答