2010-05-27 228 views
4

我有一個循環應由insering一個OpenMP的編譯很好地被並行化:線程安全

boost::normal_distribution<double> ddist(0, pow(retention, i - 1)); 
    boost::variate_generator<gen &, BOOST_TYPEOF(ddist)> dgen(rng, ddist); 
    // Diamond                 
    const std::uint_fast32_t dno = 1 << i - 1; 
// #pragma omp parallel for 
    for (std::uint_fast32_t x = 0; x < dno; x++) 
    for (std::uint_fast32_t y = 0; y < dno; y++) 
     { 
     const std::uint_fast32_t diff = size/dno; 
     const std::uint_fast32_t x1 = x*diff, x2 = (x + 1)*diff; 
     const std::uint_fast32_t y1 = y*diff, y2 = (y + 1)*diff; 
     double avg = 
      (arr[x1][y1] + arr[x1][y2] + arr[x2][y1] + arr[x2][y2])/4; 
     arr[(x1 + x2)/2][(y1 + y2)/2] = avg + dgen(); 
     } 

(除非我讓每個執行完全不依賴別人的錯誤比較遺憾的是沒有。所有代碼都被插入)。

但是我的問題是 - 是提高RNG線程安全嗎?他們似乎將gcc代碼引用到gcc中,所以即使gcc代碼是線程安全的,其他平臺也可能不是這種情況。

回答

6

通過Boost郵件列表歸檔瀏覽得出:

Boost.Random不維護全球 狀態,將需要保護的 多線程。

只要 Boost.Random是線程安全的,您不能同時訪問 兩個線程中的任何給定對象。 (訪問 兩個不同的對象是好的,只要他們不共享引擎,只要 )。如果你需要這樣的安全性,那麼它就是 ,你可以使用 合適的互斥包裝。

+4

換句話說,爲每個線程創建一個rng? – pyCthon 2012-09-30 16:33:53

1

如果您擔心線程安全,請不要使用boost,請使用TRNG。它是一個並行隨機數生成庫,可以在德國的TINA集羣上運行。它允許您創建多個隨機數字流。有一個關於如何在OpenMP中使用TRNG的教程,這裏就像您正在嘗試的那樣使用http://www.lindonslog.com/programming/parallel-random-number-generation-trng/。根據您使用的線程數量來創建獨立數量的流,然後使用線程的級別從中抽取它們。它的全部在上面的教程。