我對朱莉婭相當陌生,我正在嘗試使用朱莉婭的多執行緒能力。
下面是我為探索 Julia 能力而制作的玩具示例。這是我正在嘗試做的一個非常簡化的版本。我需要并行化回圈。在這個回圈中,我正在執行一些需要緩沖區陣列的計算(在下面的示例中,緩沖區當然是不必要的)。緩沖區也不能在執行緒之間共享,因為它會導致競爭條件。
我正在使用宏 @threads 來并行化我的回圈。問題是我找不到一種方法來定義不同執行緒應如何與 buf 陣列互動:
- 有沒有辦法定義陣列是否應該共享或者每個執行緒都有它的復制方式。例如,它在 OpenMP 中的作業方式以及變數的私有或共享宣告系統?
- 在回圈中初始化陣列不是一個選項,因為它將在每個步驟中創建重新分配記憶體,而不是為每個執行緒創建一次。
- 是否有不同的 julia 庫更適合這種應用程式?
function calcparallel(buf::AbstractArray,result::AbstractArray)
@threads for i=1:length(result)
buf[1] = float(i)
buf[2] = 1.0/float(i)
buf[3] = sqrt(i)
result[i] = buf[1] * buf[3] buf[2]
end
return result
end
n = 1000
nn = 10
buf2 = zeros(Float64,nn)
result2 = zeros(Float64,n)
@time calcparallel(buf2,result2)
uj5u.com熱心網友回復:
執行緒本地緩沖區的模式是這樣的:
function calcparallel(buf::AbstractArray,result::AbstractArray)
bufs = [zeros(3) for _ in Threads.nthreads()]
@threads for i=1:length(result)
buf = bufs[Threads.threadid()]
buf[1] = float(i)
buf[2] = 1.0/float(i)
buf[3] = sqrt(i)
result[i] = buf[1] * buf[3] buf[2]
end
return result
end
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/407397.html
標籤:
上一篇:主執行緒和父執行緒一樣嗎?
