Julia의 멀티 스레딩 문제

Aug 18 2020

코드의 일부를 병렬 처리하려고하지만 다음 함수 main1 () 및 main2 ()가 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

main1 ()의 병렬화를 어떻게 적절하게 수정할 수 있습니까?

답변

1 PrzemyslawSzufel Aug 18 2020 at 23:44

@threads루프를 중첩 할 수 없으므로 일반적으로 다음을 수행해야합니다.

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

그러나 코드 ic에서 다른 값 쌍에 대해 동일한 값을 얻습니다 (i,j). 에서 main1당신은 동일한 부품을 덮어 쓰는 L, FF, FT명백한 버그가 여러 번. 멀티 스레딩은 데이터를 덮어 쓰는 순서를 변경하므로 다른 결과가 생성됩니다. 결론적으로, 먼저 수정 main1하고 병렬화하십시오.