這是我的代碼的簡化版本:
function simula(v)
a = zeros(length(v))
for i in 1:1000000
a -= v
a[1] = 3.
a = a.^2
end
end
v = ones(100)
_ = simula(v) #compile
@time Threads.@threads for i in 1:10
simula(v)
end
如果我使用 1,2 或 4 個執行緒運行此代碼,則沒有任何變化(就時間而言)。你知道為什么嗎?我的直覺是涉及向量的操作已經使用了多執行緒。有沒有辦法并行化它?我的目標是在具有 100 個內核的集群上運行函式simula。提前致謝。
uj5u.com熱心網友回復:
默認情況下只使用 1 個執行緒。您可以使用作業系統的任務管理器查看。您需要先設定JULIA_NUM_THREADS環境變數(將其設定為核心數)。在 Windows 上,您可以使用默認批處理解釋器來執行此操作set JULIA_NUM_THREADS=4(對于 4 個執行緒)。話雖如此,該計劃的規模很差。
主要原因是由于垃圾收集器(GC) 承受壓力而無法擴展。實際上,串行程式導致 22% 的 GC 時間,而使用 4 個執行緒的并行版本導致 45% 的 GC 時間(使用 6 核機器)。這是很多,這表明分配太多。您可以使用基本的普通回圈重寫您的代碼,然后它會在順序上更快并且也可以更好地擴展:
function simula(v)
a = zeros(length(v))
for i in 1:1000000
for j in 1:length(a)
a[j] -= v[j]
end
a[1] = 3.
for j in 1:length(a)
a[j] *= a[j]
end
end
end
一個更簡單的實作是使用.@OscarSmith 指出的基于 - 的運算子:
function simula(v)
a = zeros(length(v))
for i in 1:1000000
a .-= v
a[1] = 3.
a .= a.^2
end
end
串行版本比以前快約 15 倍,使用 4 執行緒的并行版本比以前快約 40 倍。使用 6 個執行緒,它比以前快了大約 50 倍。并行版本比串行版本快 3.7 倍。這對于少量的迭代來說并不算太糟糕。
請注意,程式什么都不做,編譯器通常可以優化代碼什么都不做(即從程式中洗掉這些部分)。您應該始終對具有可見效果的代碼進行基準測驗,以避免基準測驗中的偏差(和誤導性結論)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/523278.html
標籤:多线程并行处理朱莉娅模拟
