用python多处理同时写入浮点数组

2024-04-29 05:09:00 发布

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

不久前我编写了一个矩阵乘法器,为了使它更快,我尝试使它线程化,只是为了发现线程在同一进程上运行。。后来我发现了我在下面代码中实现的多处理库。现在,我不知道如何合并生成的进程所做的工作,因为结果不在共享内存中。你知道吗

如何将分布式计算合并到“final\u multi”变量中?你知道吗

这是我的密码:

#!/usr/bin/env python
import numpy as np
from multiprocessing import Process, Array

T=64
v1 = np.empty([T,T], dtype=np.float32)
v2 = np.empty_like(v1)
final_multi = np.empty_like(v1)
#shared = Array('f', final_multi) This doesnt work
def calclinea(mat1, mat2, fil, col):
    escalar = 0
    for vl in range(T):
        escalar += mat1[fil,vl]*mat2[vl,col]
    return escalar

def mulshared(vec1, vec2, froY, toY, froX, toX):
    global final_multi
    for y in range(froY,toY):
        for x in range(froX, toX):
            final_multi[x,y] = calclinea(vec1,vec2,x,y)
            #shared[x,y] = calclinea(vec1,vec2,x,y)

def main():
    for r in range(T):    ### Allocate host memory
        for c in range(T):
            v1[r,c] = r
            v2[r,c] = c+2
            final_multi[r,c] = 0

    #p1 =Process(target=mulshared, args=(v1,v1,0,(T*1/4 -1),0,T))
    #p2 =Process(target=mulshared, args=(v1,v1,(T*1/4),(T*2/4 -1),0,T))
    #p3 =Process(target=mulshared, args=(v1,v1,(T*2/4),(T*3/4 -1),0,T))
    p4 =Process(target=mulshared, args=(v1,v1,T*3/4,T*4/4,0,T)) #All four processes to demo distribution of data, only 4th is initialized so result can be seen, p1 result is all zeros so..

    p4.start()
    p4.join()

    print "\nfinal_multi\n", final_multi
main()

我知道这是一种低效的矩阵乘法方法,我只想学习多处理的工作原理,提前谢谢。你知道吗


Tags: intargetfordefnpargsrangeprocess
1条回答
网友
1楼 · 发布于 2024-04-29 05:09:00

您可以使用sharedmem模块,它是Python附带的多处理模块的增强版本。它提供了一种在进程之间共享内存的简单方法。你知道吗

import sharedmem as shmem

out_matrix = shmem.empty((400,400))

def do_work(x):
    out_matrix[100*x:100*(x+1), :] = x

def main():
    with shmem.MapReduce(np=4) as pool:
        pool.map(do_work, range(4))

在这个最小的例子中,输出矩阵将由四个并行的worker填充。你知道吗

相关问题 更多 >