并行化python代码中的内存共享

时间:2012-07-20 01:15:24

标签: python matrix parallel-processing pass-by-reference shared-memory

我是一名大学新生和Python新手,所以请耐心等待。我试图并行化一些矩阵运算。这是我尝试使用ParallelPython模块:

 def testfunc(connectionMatrix, qCount, iCount, Htry, tStepCount):
        test = connectionMatrix[0:qCount,0:iCount].dot(Htry[tStepCount-1, 0:iCount]) 
        return test  

    f1 = job_server.submit(testfunc, (self.connectionMatrix, self.qCount, self.iCount, self.iHtry, self.tStepCount), modules = ("scipy.sparse",))
    f2 = job_server.submit(testfunc, (self.connectionMatrix, self.qCount, self.iCount, self.didtHtry, self.tStepCount), modules = ("scipy.sparse",))
    r1 = f1()
    r2 = f2()
    self.qHtry[self.tStepCount, 0:self.qCount] = self.qHtry[self.tStepCount-1, 0:self.qCount] + self.delT * r1 + 0.5 * (self.delT**2) * r2

似乎有一条正常曲线,x轴上的矩阵大小和y轴上的加速百分比。它似乎在100x100矩阵上以30%的速度增长。较小和较大的矩阵导致较少的增加,并且足够小和足够大的矩阵,串行代码更快。我的猜测是问题在于论证的传递。复制大矩阵的开销实际上比作业本身花费的时间更长。我该怎么做才能解决这个问题?有没有办法合并内存共享并通过引用传递矩阵?如您所见,没有任何参数被修改,因此它可以是只读访问。

感谢。

1 个答案:

答案 0 :(得分:1)

好吧,ParallelPython的意思是你可以编写代码,不管它是分布在线程,进程甚至是多台计算机上,使用内存共享会打破这种抽象。

一种选择是在共享文件系统上使用类似文件的东西,在那里你可以在每个worker中映射该文件。当然这更复杂,无论是好还是坏都将取决于有关文件系统,共享协议和网络的大量细节,但它是一种选择。

如果您愿意放弃分布式处理选项,可以使用multiprocessing.Array(或多处理,Value或multiprocessing.sharedctypes)来访问共享内存。但是在那时,您可能想要考虑仅使用多处理而不是ParallelPython来进行作业分发,因为多处理是标准库的一部分,并且具有更强大的API,并且您明确放弃了ParallelPython的一个主要优势

或者你可以将这两个选项结合起来,在很多方面对两个世界中最糟糕的方面进行组合,但就改变现有代码所需的最少而言,可能是最好的:只需使用本地文件并对其进行mmap。

但是,在执行任何此操作之前,您可能需要考虑分析以查看复制矩阵是否确实是瓶颈。而且,如果是,您可能需要考虑是否存在算法修复,只需复制每个作业所需的部分而不是复制整个矩阵。 (当然,这是否有意义取决于每个工作所需的部分是否明显少于整个部分。)