Masalah multi-threading di Julia
Aug 18 2020
Saya mencoba memparalelkan beberapa bit kode tetapi saya tidak mengerti mengapa fungsi berikut main1 () dan main2 () memberikan hasil yang berbeda menggunakan multi-threading 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
Bagaimana parallelisasi main1 () bisa diperbaiki dengan benar?
Jawaban
1 PrzemyslawSzufel Aug 18 2020 at 23:44
Anda tidak dapat membuat @threads
loop bersarang, jadi biasanya Anda harus melakukan:
Threads.@threads for u in vec(CartesianIndices((4,4)))
i,j = u.I
# your code goes here
end
Namun, dalam kode Anda, Anda mendapatkan nilai yang sama ic
untuk pasangan nilai yang berbeda (i,j)
. Dalam main1
Anda Timpa bagian yang sama dari L
, FF
, FT
banyak kali yang merupakan bug jelas. Multi-threading akan mengubah urutan penimpaan data sehingga akan menghasilkan hasil yang berbeda. Kesimpulannya, perbaiki dulu main1
dan kemudian paralelkan.
Kiat Pemilik Anjing yang Bermanfaat: Mengapa Penting untuk Membiarkan Anjing Anda Mengendus di Jalan
Jana Duggar: Semua yang Dia Katakan Tentang Cinta dan Jendela 5 Tahunnya untuk Menemukan 'Yang Satu'