Multithreading-Problem in Julia

Aug 18 2020

Ich versuche, einige Teile eines Codes zu parallelisieren, aber ich verstehe nicht, warum die folgenden Funktionen main1 () und main2 () mit Julias Multithreading unterschiedliche Ergebnisse liefern:

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

Wie könnte die Parallelisierung von main1 () richtig behoben werden?

Antworten

1 PrzemyslawSzufel Aug 18 2020 at 23:44

Sie können keine @threadsSchleifen verschachteln , daher sollten Sie normalerweise Folgendes tun:

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

In Ihrem Code erhalten Sie jedoch den gleichen icWert für verschiedene Wertepaare von (i,j). In der main1überschreiben Sie die gleichen Teile L, FF, FTviele Male , die ein offensichtlicher Fehler ist. Durch Multithreading wird die Reihenfolge geändert, in der die Daten überschrieben werden, sodass unterschiedliche Ergebnisse erzielt werden. Abschließend zuerst reparieren main1und dann parallelisieren.