Problema de multi-threading em Julia

Aug 18 2020

Estou tentando paralelizar alguns bits de um código, mas não entendo por que as seguintes funções main1 () e main2 () fornecem resultados diferentes usando o multi-threading de 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

Como a paralelização de main1 () poderia ser corrigida corretamente?

Respostas

1 PrzemyslawSzufel Aug 18 2020 at 23:44

Você não pode aninhar @threadsloops, então normalmente você deve fazer:

Threads.@threads for u in vec(CartesianIndices((4,4)))
    i,j = u.I
    # your code goes here
end

No entanto, em seu código, você obtém o mesmo icvalor para diferentes pares de valores de (i,j). No main1que você está substituindo as mesmas partes do L, FF, FTmuitas vezes o que é um erro óbvio. O multi-threading mudará a ordem em que os dados são sobrescritos, gerando resultados diferentes. Em conclusão, primeiro conserte main1e depois coloque em paralelo.