Julia'da çoklu iş parçacığı sorunu
Aug 18 2020
Bir kodun bazı bitlerini paralel hale getirmeye çalışıyorum ancak aşağıdaki main1 () ve main2 () işlevlerinin Julia'nın çoklu iş parçacığını kullanarak neden farklı sonuçlar verdiğini anlamıyorum:
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 () 'in paralelliği nasıl düzgün bir şekilde düzeltilebilir?
Yanıtlar
1 PrzemyslawSzufel Aug 18 2020 at 23:44
@threads
Döngüleri iç içe yerleştiremezsiniz, bu nedenle normalde yapmanız gerekir:
Threads.@threads for u in vec(CartesianIndices((4,4)))
i,j = u.I
# your code goes here
end
Ancak, kodunuzda ic
farklı değerler çifti için aynı değeri alırsınız (i,j)
. Gelen main1
Eğer aynı parçalar üzerine yazıyorsunuz L
, FF
, FT
bariz bir hata olduğunu defalarca. Çoklu iş parçacığı, verilerin üzerine yazılma sırasını değiştirecek ve böylece farklı sonuçlar verecektir. Sonuç olarak, önce düzeltin main1
ve sonra paralelleştirin.
Donovan, Şarkılarından 1'ini The Beatles'ın "Lucy in the Sky with Diamonds" şarkısıyla karşılaştırdı
Nicole Kidman, Michael Keaton ve Val Kilmer'in Batman Olarak Paylaştığı Bu 1 Çekici Özelliğe Bayıldı
Tom Girardi Dolandırıcılık Suçlamalarından Yargılanma Yetkisinin Belirlenmesi İçin Duruşmaya Katıldı
Charly Reynolds Yakın Zamandaki Vokal Kord Ameliyatını Açıkladı: 'Şarkı Söylemekte Sorun Yaşıyordum'