2 回答

TA貢獻1906條經驗 獲得超10個贊
隨機數生成器rand(3)使用全局狀態變量(隱藏在(g)libc實現中)。從多個線程訪問它們會導致緩存問題,而且也不安全。您應該對線程rand_r(3)使用seed參數private 的調用:
long i;
unsigned seed;
#pragma omp parallel private(seed)
{
// Initialise the random number generator with different seed in each thread
// The following constants are chosen arbitrarily... use something more sensible
seed = 25234 + 17*omp_get_thread_num();
#pragma omp for
for (i = 0; i <= 1000000000; i++) {
double x = rand_r(&seed);
}
}
請注意,并行執行與串行執行時會產生不同的隨機數流。我還建議將其erand48(3)作為更好的(偽)隨機數源。

TA貢獻1829條經驗 獲得超7個贊
rand()
是一個外部庫函數。它的聲明stdlib.h
絕不會說明它是否修改了外部狀態,此外,其代碼還隱藏在已編譯的庫中。GCC __atribute__ ((pure))
為純外部功能提供了顯式注釋。只需嘗試在啟用最大優化的情況下編譯串行版本,然后自己看看。
添加回答
舉報