使用@parallel,Julia明显变慢了

pav*_*elf 1 julia

我有这个代码(原始传热):

function heat(first, second, m)
    @sync @parallel for d = 2:m - 1
        for c = 2:m - 1
            @inbounds second[c,d] = (first[c,d] + first[c+1, d] + first[c-1, d] + first[c, d+1] + first[c, d-1]) / 5.0;
        end
    end
end

m = parse(Int,ARGS[1]) #size of matrix
firstm = SharedArray(Float64, (m,m))
secondm = SharedArray(Float64, (m,m))

for c = 1:m
    for d = 1:m
        if c == m || d == 1
            firstm[c,d] = 100.0
            secondm[c,d] = 100.0
        else
            firstm[c,d] = 0.0
            secondm[c,d] = 0.0
        end
    end
end
@time for i = 0:opak
    heat(firstm, secondm, m)
    firstm, secondm = secondm, firstm
end
Run Code Online (Sandbox Code Playgroud)

这段代码在顺序运行时给出了很好的时间,但是当我添加@parallel时,即使我在一个线程上运行它也会减慢速度.我只是需要解释为什么会这样?仅在不改变热函数算法的情况下编码.

Lut*_*mak 8

请查看http://docs.julialang.org/en/release-0.4/manual/performance-tips/.与建议相反,您经常使用全局变量.它们被认为可以随时更改类型,因此每次引用时都必须对它们进行装箱和取消装箱.这个问题也与Julia pi aproximation慢慢受同样的影响.为了使您的函数更快,请将全局变量作为函数的输入参数.