我試圖並行化一個單一的MCMC鏈,這個鏈在本質上是順序的,因此我需要保留正在執行的迭代順序。爲此,我想通過OpenMP使用'ordered for'循環。我想知道如何在OpenMP中執行一個有序的for循環真的起作用,它真的提供了代碼並行化方面的加速嗎?在OpenMP中爲'循環效率'排序
謝謝!
我試圖並行化一個單一的MCMC鏈,這個鏈在本質上是順序的,因此我需要保留正在執行的迭代順序。爲此,我想通過OpenMP使用'ordered for'循環。我想知道如何在OpenMP中執行一個有序的for循環真的起作用,它真的提供了代碼並行化方面的加速嗎?在OpenMP中爲'循環效率'排序
謝謝!
只要你具有隻是一個單一的馬爾可夫鏈,並行它是最簡單的方法使用'尷尬'並行:運行一堆獨立鏈並在完成所有工作時收集結果[或者偶爾收集結果。]
這樣您就不會發生任何通信開銷。
這裏的主要警告是,你需要確保不同的鏈獲得不同的隨機數發生器種子。
UPD:收集結果的實用性。
簡而言之,您只需將所有鏈條生成的結果混合在一起即可。爲了簡單起見,假設你有三個獨立的鏈條:
x1, x2, x3,...
y1, y2, y3,...
z1, z2, z3,...
從這些,你犯了一個鏈x1,y1,z1,x2,y2,z2,x3,y3,z3,...
這是一個完全有效的MC鏈,其樣本的正確分佈。
寫出所有的鏈條歷史幾乎總是不切實際的。通常情況下,每個鏈條都會保存裝箱統計數據,然後將其混合在一起並通過單獨的程序進行分析。對於分箱分析,參見例如[boulder.research.yale.edu/Boulder-2010/ReadingMaterial-2010/Troyer/Article.pdf] [1]
openMP ordered指令只能在動態透視圖中列出。
規範建議,雖然寫作,我們必須提到有序的關鍵字。但是,循環中的哪個位置是有序的塊是您的選擇。
我的猜想是即使我們提到有序關鍵字for,每個線程將並行開始其工作。任何遇到有序關鍵字的線程只有在前面的所有迭代都完成後才能進入該塊。請關注關鍵字全部必須完成先前的迭代。
上述推論的直覺是,「有序」如果連續執行完全沒有任何意義。
如果你的循環只包含一個有序結構的塊,那麼執行將是串行的,並且你不會從並行執行中獲得任何加速。 在下面的例子有一個塊可以並行執行,並且一個將被序列:
void example(int b, int e, float* data)
{
#pragma omp for schedule(static) ordered
for (int i = b; i < e; ++i) {
// This block can be executed in parallel
data[i] = SomeThing(data[i]);
if (data[i] == 0.0f)
{
// This block will be serialized
#pragma omp ordered
printf("Element %d resulted in zero\n", i);
}
}
}
我對如何從不同的連鎖店收集結果感到困惑。你能幫我解決嗎?如同,獨立小型連鎖企業的結果應該如何結合才能獲得最終結果? – user1105630
@ user1105630我已經更新了答案。我通常做的,我有shell腳本來運行鏈,還有一個單獨的程序,它讀入所有鏈的分箱統計信息並生成最終結果。 –
非常感謝您的幫助。如果不是x1,y1,z1,x2,y2 ..,我使用x1,x2,x3,..,y1,y2,y3 ...,z1,z2,z3 ..會是有效的嗎? 或者合併應該在每一步完成? – user1105630