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
하고 병렬화하십시오.