ปัญหามัลติเธรดใน Julia

Aug 18 2020

ฉันกำลังพยายามขนานบิตของโค้ด แต่ฉันไม่เข้าใจว่าทำไมฟังก์ชันต่อไปนี้ main1 () และ main2 () ให้ผลลัพธ์ที่แตกต่างกันโดยใช้มัลติเธรดของ 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

การขนานของ main1 () จะถูกแก้ไขอย่างเหมาะสมได้อย่างไร?

คำตอบ

1 PrzemyslawSzufel Aug 18 2020 at 23:44

คุณไม่สามารถซ้อน@threadsลูปได้ตามปกติคุณควรทำ:

Threads.@threads for u in vec(CartesianIndices((4,4)))
    i,j = u.I
    # your code goes here
end

อย่างไรก็ตามในรหัสของคุณคุณจะได้รับเหมือนกันค่าสำหรับคู่ที่แตกต่างกันของค่าของic (i,j)ในการmain1ที่คุณกำลังเขียนทับส่วนเดียวกันของL, FF, FTหลายครั้งซึ่งเป็นข้อผิดพลาดที่เห็นได้ชัด มัลติเธรดจะเปลี่ยนลำดับที่ข้อมูลถูกเขียนทับดังนั้นจึงให้ผลลัพธ์ที่แตกต่างกัน โดยสรุปให้แก้ไขก่อนmain1และขนานกัน