Multithreading-Problem in Julia
Ich versuche, einige Teile eines Codes zu parallelisieren, aber ich verstehe nicht, warum die folgenden Funktionen main1 () und main2 () mit Julias Multithreading unterschiedliche Ergebnisse liefern:
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
Wie könnte die Parallelisierung von main1 () richtig behoben werden?
Antworten
Sie können keine @threadsSchleifen verschachteln , daher sollten Sie normalerweise Folgendes tun:
Threads.@threads for u in vec(CartesianIndices((4,4)))
i,j = u.I
# your code goes here
end
In Ihrem Code erhalten Sie jedoch den gleichen icWert für verschiedene Wertepaare von (i,j). In der main1überschreiben Sie die gleichen Teile L, FF, FTviele Male , die ein offensichtlicher Fehler ist. Durch Multithreading wird die Reihenfolge geändert, in der die Daten überschrieben werden, sodass unterschiedliche Ergebnisse erzielt werden. Abschließend zuerst reparieren main1und dann parallelisieren.