Parallel processing 如何在单个大型矩阵上使用pmap

Parallel processing 如何在单个大型矩阵上使用pmap,parallel-processing,julia,Parallel Processing,Julia,我有一个非常大的矩阵M(大约5 Gig),并且必须对M的每一列执行操作f:Column->Column。 我想我应该使用pmap(如果我错了,请纠正我),但据我所知,我应该给它一个矩阵列表。如何有效地处理M,以便将其传递给pmap 第二个问题是,f是否最好同时获取多个列。我认为尝试这样做可能是个好主意。更好的方法是多线程,而不是Julia当前的多处理,但这还没有发布 f应该引用矩阵和列列表,而不是列本身,以避免复制 编辑:这里是我尝试的一个SharedArray示例-我自己以前从未使用过它,所以

我有一个非常大的矩阵
M
(大约5 Gig),并且必须对
M
的每一列执行操作
f:Column->Column
。 我想我应该使用
pmap
(如果我错了,请纠正我),但据我所知,我应该给它一个矩阵列表。如何有效地处理
M
,以便将其传递给
pmap


第二个问题是,
f
是否最好同时获取多个列。

我认为尝试这样做可能是个好主意。更好的方法是多线程,而不是Julia当前的多处理,但这还没有发布

f
应该引用矩阵和列列表,而不是列本身,以避免复制

编辑:这里是我尝试的一个
SharedArray
示例-我自己以前从未使用过它,所以它可能写得很差

addprocs(3)

@everywhere rows = 10000
@everywhere cols = 100
data = SharedArray(Float64, (rows,cols))

@everywhere function f(col, data)
    for row = 1:rows
        new_val = rand()*col
        for dowork = 1:10000
            new_val = sqrt(new_val)^2
        end
        data[row,col] = new_val
    end
end

tic()
pmap(g->f(g...), [(col,data) for col in 1:cols])
toc()

for i = 1:10:cols
    println(i, " ", mean(data[:,i]), " ", 0.5*i)
end

tic()
map(g->f(g...), [(col,data) for col in 1:cols])
toc()
有输出

elapsed time: 24.454875168 seconds
1 0.49883655930753457 0.5
11 5.480063271913496 5.5
21 10.495998948926 10.5
31 15.480227440365235 15.5
41 20.70105670567518 20.5
51 25.300540822213783 25.5
61 30.427728439076436 30.5
71 35.5280001975307 35.5
81 41.06101008798742 40.5
91 45.72394376323945 45.5
elapsed time: 69.651211534 seconds

因此,我们得到了大约3倍的加速,正如所希望的那样。作业运行的时间越长,它就越接近理想状态,因为可能有一些JIT预热时间。

+1用于列提示。如果你能添加一个小例子,包括将结果合并到矩阵中,我会将其标记为已解决。我添加了一个例子,希望能帮助如何使用ShareDarray