2 回答

TA貢獻(xiàn)1772條經(jīng)驗 獲得超6個贊
隨機數(shù)生成器rand(3)使用全局狀態(tài)變量(隱藏在(g)libc實現(xiàn)中)。從多個線程訪問它們會導(dǎo)致緩存問題,而且也不安全。您應(yīng)該對線程rand_r(3)使用seed參數(shù)private 的調(diào)用:
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);
}
}
請注意,并行執(zhí)行與串行執(zhí)行時會產(chǎn)生不同的隨機數(shù)流。我還建議將其erand48(3)作為更好的(偽)隨機數(shù)源。

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