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 @threadsloop 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 icuntuk pasangan nilai yang berbeda (i,j). Dalam main1Anda Timpa bagian yang sama dari L, FF, FTbanyak kali yang merupakan bug jelas. Multi-threading akan mengubah urutan penimpaan data sehingga akan menghasilkan hasil yang berbeda. Kesimpulannya, perbaiki dulu main1dan 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'