Parallel processing Julia中的多线程问题

Parallel processing Julia中的多线程问题,parallel-processing,julia,Parallel Processing,Julia,我正在尝试并行化一些代码位,但我不明白为什么以下函数main1()和main2()使用Julia的多线程给出不同的结果: a = rand(4,4);b = rand(4,4);c = rand(4,4);d = rand(4,4) function main1(a,b,c,d) L = zeros(2,2,16) FF = zeros(2,2,16) FT = zeros(2,2,16) F = Array{Float32}(undef,2,2) #

我正在尝试并行化一些代码位,但我不明白为什么以下函数main1()和main2()使用Julia的多线程给出不同的结果:

a = rand(4,4);b = rand(4,4);c = rand(4,4);d = rand(4,4)

function main1(a,b,c,d)
    L = zeros(2,2,16)
    FF = zeros(2,2,16)
    FT = zeros(2,2,16)
    F = Array{Float32}(undef,2,2)
    # L = Array{Array{Float32, 1}, 4}

    for i = 1:4
        for j = 1:4
            ic = i + j*(i-1)
            F[1,1] = a[i,j]
            F[1,2] = b[i,j]
            F[2,1] = c[i,j]
            F[2,2] = d[i,j]
            L[:,:,ic] .= F * F'
            FF[:,:,ic] .= F
            FT[:,:,ic] .= F'
        end
    end
    return L,FF,FT
end

function main2(a,b,c,d)

    L  = zeros(2,2,16)
    FF = zeros(2,2,16)
    FT = zeros(2,2,16)
    F  = Array{Float32}(undef,2,2)
    # L = Array{Array{Float32, 1}, 4}

    Threads.@threads for i = 1:4
        Threads.@threads for j = 1:4
            ic = i + j*(i-1)
            F[1,1] = a[i,j]
            F[1,2] = b[i,j]
            F[2,1] = c[i,j]
            F[2,2] = d[i,j]
            L[:,:,ic] .= F * F'
            FF[:,:,ic] .= F
            FT[:,:,ic] .= F'
        end
    end
    return L,FF,FT
end

如何正确修复main1()的并行化?

您不能嵌套
@线程
循环,因此通常您应该执行以下操作:

Threads.@threads for u in vec(CartesianIndices((4,4)))
    i,j = u.I
    # your code goes here
end
但是,在代码中,对于
(i,j)
的不同值对,您会得到相同的
ic
值。在
main1
中,您多次覆盖
L
FF
FT
的相同部分,这是一个明显的错误。多线程将改变数据被覆盖的顺序,从而产生不同的结果。总之,首先修复main1,然后将其并行化