Masalah multi-threading di Julia

Aug 18 2020

Saya mencoba memparalelkan beberapa bit kode tetapi saya tidak mengerti mengapa fungsi berikut main1 () dan main2 () memberikan hasil yang berbeda menggunakan multi-threading 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

Bagaimana parallelisasi main1 () bisa diperbaiki dengan benar?

Jawaban

1 PrzemyslawSzufel Aug 18 2020 at 23:44

Anda tidak dapat membuat @threadsloop bersarang, jadi biasanya Anda harus melakukan:

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

Namun, dalam kode Anda, Anda mendapatkan nilai yang sama icuntuk pasangan nilai yang berbeda (i,j). Dalam main1Anda Timpa bagian yang sama dari L, FF, FTbanyak kali yang merupakan bug jelas. Multi-threading akan mengubah urutan penimpaan data sehingga akan menghasilkan hasil yang berbeda. Kesimpulannya, perbaiki dulu main1dan kemudian paralelkan.