并行python-cod中的内存共享

2024-06-07 14:01:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我是大学一年级新生,也是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%。矩阵越小,增量越小;矩阵越小,矩阵越大,串行编码速度越快。我想问题出在争论的传递上。复制大矩阵的开销实际上比作业本身花费的时间要长。我能做些什么来避开这个问题?有没有什么方法可以合并内存共享和通过引用传递矩阵?如您所见,没有修改任何参数,因此它可以是只读访问。在

谢谢。在


Tags: testselfmodulesserverjob矩阵scipyf1
1条回答
网友
1楼 · 发布于 2024-06-07 14:01:50

好吧,ParallelPython的要点是,您可以编写不关心它是否分布在线程、进程甚至多台计算机上的代码,使用内存共享将打破这种抽象。在

一种选择是使用类似于共享文件系统上的文件的东西,您可以在每个工作进程中对该文件进行mmap。当然,这更复杂,它是好是坏取决于文件系统、共享协议和网络的许多细节,但这是一种选择。在

如果您愿意放弃分布式处理的选择,可以使用多处理.数组(或多处理、值或多处理.sharedTypes)访问共享内存。但在这一点上,您可能需要考虑在作业分发中使用多处理而不是ParallelPython,因为多处理是标准库的一部分,并且有一个更强大的API,而且您明显地放弃了parallellepython的一个主要优势。在

或者你可以把这两种方法结合起来,从很多方面来说,这两种方法都是最坏的,但最好的方法是不需要对现有代码进行多少更改:只需使用一个本地文件并对其进行mmap。在

但是,在执行任何操作之前,您可能需要考虑分析,看看复制矩阵是否真的是瓶颈。如果是的话,你可能需要考虑是否有一个算法修正,只是复制每个工作需要的部分,而不是复制整个矩阵。(当然,这是否合理取决于每项工作所需的部分是否明显少于整个工作。)

相关问题 更多 >

    热门问题