Julia'da çoklu iş parçacığı sorunu

Aug 18 2020

Bir kodun bazı bitlerini paralel hale getirmeye çalışıyorum ancak aşağıdaki main1 () ve main2 () işlevlerinin Julia'nın çoklu iş parçacığını kullanarak neden farklı sonuçlar verdiğini anlamıyorum:

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 () 'in paralelliği nasıl düzgün bir şekilde düzeltilebilir?

Yanıtlar

1 PrzemyslawSzufel Aug 18 2020 at 23:44

@threadsDöngüleri iç içe yerleştiremezsiniz, bu nedenle normalde yapmanız gerekir:

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

Ancak, kodunuzda icfarklı değerler çifti için aynı değeri alırsınız (i,j). Gelen main1Eğer aynı parçalar üzerine yazıyorsunuz L, FF, FTbariz bir hata olduğunu defalarca. Çoklu iş parçacığı, verilerin üzerine yazılma sırasını değiştirecek ve böylece farklı sonuçlar verecektir. Sonuç olarak, önce düzeltin main1ve sonra paralelleştirin.