Problema de multi-threading em Julia
Aug 18 2020
Estou tentando paralelizar alguns bits de um código, mas não entendo por que as seguintes funções main1 () e main2 () fornecem resultados diferentes usando o multi-threading de 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
Como a paralelização de main1 () poderia ser corrigida corretamente?
Respostas
1 PrzemyslawSzufel Aug 18 2020 at 23:44
Você não pode aninhar @threads
loops, então normalmente você deve fazer:
Threads.@threads for u in vec(CartesianIndices((4,4)))
i,j = u.I
# your code goes here
end
No entanto, em seu código, você obtém o mesmo ic
valor para diferentes pares de valores de (i,j)
. No main1
que você está substituindo as mesmas partes do L
, FF
, FT
muitas vezes o que é um erro óbvio. O multi-threading mudará a ordem em que os dados são sobrescritos, gerando resultados diferentes. Em conclusão, primeiro conserte main1
e depois coloque em paralelo.
O que significa um erro “Não é possível encontrar o símbolo” ou “Não é possível resolver o símbolo”?
George Harrison ficou chateado por suas letras de 'Hurdy Gurdy Man' de Donovan não terem sido usadas