我從OpenMP並行部分代碼中收到「總線錯誤」。我在下面重新創建了一個我的問題的簡單版本。該代碼基本上對函數uniform_distribution
進行了很多調用,該函數使用Boost的uniform_int_distribution繪製0到20000之間的整數。Boost Random和OpenMP
這個post警告兩個線程訪問同一個對象。我猜這是我的情況eng
。 (不幸的是,我不知道如何編寫「一個合適的互斥包裝器」,正如該文章所暗示的那樣)。
我想到的一個可能的骯髒解決方案是在#pragma for
循環內創建一個本地eng
並將其作爲參數傳遞給uniform_distribution
。我不喜歡這個想法,因爲在我的真實代碼中,我調用了很多函數,傳遞一個本地的eng
會很麻煩。此外,我擔心的是,如果我在uniform_distribution
內聲明eng
,不同的線程將生成相同的隨機數字序列。所以,我有兩個要求:如何並行的方式,
- 每個線程生成概率獨立於其他線程借鑑?
- RNG上沒有競態條件嗎?
謝謝;任何幫助熱烈讚賞。
#include <omp.h>
#include <boost/random/uniform_int_distribution.hpp>
boost::random::mt19937 eng;
int uniform_distribution(int rangeLow, int rangeHigh) {
boost::random::uniform_int_distribution<int> unirv(rangeLow, rangeHigh);
return unirv(eng);
}
int main()
{
# pragma omp parallel for private(eng)
for (int bb=0; bb<10000; bb++)
for (int i=0; i<20000; i++)
int a = uniform_distribution(0,20000);
return 0;
}
私有子句實際上會創建一個變量的線程本地版本。與已應用threadprivate指令的變量不同,它將在線程加入時未分配。但是,這在OP的例子中不是問題。私人條款在這裏不起作用的原因是uniform_distribution中引用的eng是全局的,而不是線程特定的。 – jerry 2013-03-19 18:26:54
是的,你關於'priavte'的觀點是正確的。我刪除了一個句子。但是,OP所具有的問題實質上是私有化問題。使線程本地化將是一個解決方案。你的第二個解決方案也是私有化的一種方式。 – minjang 2013-03-19 19:23:16
FYI:http://msdn.microsoft.com/en-us/library/c3dabskb(v=vs.80).aspx – minjang 2013-03-19 20:03:10