Sự cố đa luồng trong Julia

Aug 18 2020

Tôi đang thử song song hóa một số bit của mã nhưng tôi không hiểu tại sao các hàm main1 () và main2 () sau đây cho kết quả khác nhau bằng cách sử dụng đa luồng của 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

Làm thế nào có thể sửa lỗi song song của main1 ()?

Trả lời

1 PrzemyslawSzufel Aug 18 2020 at 23:44

Bạn không thể lồng @threadscác vòng lặp, vì vậy thông thường bạn nên làm:

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

Tuy nhiên, trong mã của bạn, bạn nhận được cùng một icgiá trị cho các cặp giá trị khác nhau của (i,j). Trong main1bạn đang ghi đè lên các bộ phận tương tự của L, FF, FTnhiều lần mà là một lỗi rõ ràng. Đa luồng sẽ thay đổi thứ tự ghi đè dữ liệu, do đó nó sẽ tạo ra các kết quả khác nhau. Tóm lại, trước tiên hãy sửa chữa main1và song song hóa nó.