如何在单个大型Matrix上使用pmap

时间:2014-09-10 15:46:13

标签: parallel-processing julia

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

第二个问题是f是否可以同时使用多列。

1 个答案:

答案 0 :(得分:2)

我认为为此尝试SharedArray可能是个好主意。更好的是多线程而不是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预热时间。