Parallel processing 调整并行性能

Parallel processing 调整并行性能,parallel-processing,ipython,Parallel Processing,Ipython,基本上,我有一个大的对象,我想在它上面执行一些功能,它很适合并行处理。在这个例子中,我有一个大矩阵,我想计算列向量之间的所有成对内积 请看以下内容 我意识到在这种情况下,@interactive装饰器是不必要的,我尝试删除@require装饰器,但其影响可以忽略不计 我的问题是:有什么方法可以提高并联机器的性能吗 我不知道map方法的实现细节,我可以通过在视图中推动与引擎并行执行的函数来避免开销吗?不过,我无法想象它会随每个参数一起发送 我自己把参数列表分块,然后编写一个远程使用的函数,这样做似

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

请看以下内容

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

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

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

我自己把参数列表分块,然后编写一个远程使用的函数,这样做似乎也很愚蠢


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

这里的主要性能问题是,您应用的fortran连续优化在网络传输中无法生存,因此引擎上的
mat
推送之后是C连续的,而不是F连续的

您可以通过以下方式看到这一点:

print mat.flags
%px print mat.flags
添加:

%px mat = numpy.asfortranarray(mat)
应该可以恢复你的表现(如我的笔记本中所示)

为了诊断这个问题,我尽了最大努力找出瓶颈所在。这方面有用的是
AsyncResult.serial\u time
AsyncResult.wall\u time
。当
serial_time
很长时,这意味着任务实际上在引擎上花费了很长时间,而不是在IPython管道上花费很多时间。这让我觉得任务本身在引擎上运行缓慢,所以我在一个引擎上远程执行任务, 而且速度仍然很慢(没有类似的问题)。现在我们来追踪这个问题

旁注:


@interactive
decorator仅对未以交互方式定义的功能(即模块功能,而不是笔记本中定义的功能)是必需的,因此它在笔记本中是多余的。

太棒了,谢谢您的时间和精力。我甚至没有想到内存布局会发生变化。对于数组的零拷贝发送,IPython要求它们是连续的。为此,IPython使用
ascontiguousarray
,这实际上会将F-连续数组强制为C-连续数组,即使它可能不需要(有时可能会强制,具体取决于切片)。我将研究F-连续数组的零拷贝发送将涉及到什么,以避免这种奇怪的情况。