我在計算pi時遇到了一些麻煩,我的蒙特卡羅方法並行化。這裏是循環的並行化:pi計算的OpenMP並行化速度很慢或者錯誤
#pragma omp parallel for private(i,x,y) schedule(static) reduction(+:count)
for (i = 0; i < points; i++) {
x = rand()/(RAND_MAX+1.0)*2 - 1.0;
y = rand()/(RAND_MAX+1.0)*2 - 1.0;
// Check if point lies in circle
if(x*x + y*y < 1.0) { count++; }
}
的問題是,它低估了PI如果我使用schedule(static)
,其比串行執行要慢,如果我用schedule(dynamic)
。我究竟做錯了什麼?我已經嘗試了其他方法來解決它(例如:Using OpenMP to calculate the value of PI),但它仍然比串行實施慢得多。
在此先感謝
'rand()'線程安全嗎? – Mysticial
@Mystical:看起來不是:http://stackoverflow.com/questions/6161322/using-rand-with-multiple-threads-in-c –
我懷疑@Mysticial有正確的想法。 'rand'通常會有一個內部的「種子」,它基本上充當共享資源,在每次調用時強制序列化(否則冒着不正確的結果)。如果你有它,我會嘗試使用'rand_r'或(最好)'drand48_r'來代替。或者,考慮在C++ 11中引入的隨機數生成類 - 每個實例都有其自己的狀態,這應該避免序列化(但可能會使初始化非常棘手 - 多個線程創建相同的序列並不會帶來好處)。 –