2014-01-09 134 views
0

我正在爲並行計算做一個C分配,在那裏我必須使用Box-Muller變換實現某種蒙特卡洛模擬,其中包括高效的胎面安全正態隨機發生器。我生成2個統一的隨機數X和Y的向量,其條件是X在(0,1]和Y在[0,1]中。但我不確定我是如何從半開始間隔(0,1]是正確 有沒有人遇到類似 我用下面的代碼的東西:?OpenMP C正態隨機發生器

double* StandardNormalRandom(long int N){ 
    double *X = NULL, *Y = NULL, *U = NULL; 

    X = vUniformRandom_0(N/2); 
    Y = vUniformRandom(N/2); 
    #pragma omp parallel for 
    for (i = 0; i<N/2; i++){ 
      U[2*i] = sqrt(-2 * log(X[i]))*sin(Y[i] * 2 * pi); 
      U[2*i + 1] = sqrt(-2 * log(X[i]))*cos(Y[i] * 2 * pi); 
      } 
    return U; 
    } 

    double* NormalRandom(long int N, double mu, double sigma2) 
    { 
      double *U = NULL, stdev = sqrt(sigma2); 
      U = StandardNormalRandom(N); 
      #pragma omp parallel for 
      for (int i = 0; i < N; i++) U[i] = mu + stdev*U[i]; 
      return U; 
    } 

這裏是我UniformRandom功能位並行還實施:

#pragma omp parallel for firstprivate(i) 
for (long int j = 0; j < N;j++) 
{ 
    if (i == 0){ 
     int tn = omp_get_thread_num(); 
     I[tn] = S[tn]; 
     i++; 
    } 
    else 
    { 
     I[j] = (a*I[j - 1] + c) % m; 
    } 

} 

} 
#pragma omp parallel for 
for (long int j = 0; j < N; j++) 
    U[j] = (double)I[j]/(m+1.0); 

回答

0

StandardNormalRandom函數中,我將假設指針U已經分配給第e尺寸N,在這種情況下,這個功能對我來說很好。 以及功能NormalRandom

但是對於功能UniformRandom(其中缺少一些零件,所以我必須承擔一些東西),如果下面的行I[j] = (a*I[j - 1] + c) % m + 1;是一個循環的機身採用了omp parallel for,那麼你就會有一些問題。由於您無法知道線程的執行順序,因此當前線程(固定值爲j)無法依賴I[j - 1]的值,因爲此值可能隨時被修改(默認情況下應共享I )。

希望它有幫助!

+0

這不是問題,我在線程的第一次執行時初始化I [j],並從之前生成的隨機數組中給它賦值。 – Suren

+0

@Suren好的,你可以用缺少的代碼編輯你的問題。人們會更容易幫助你。 –

+0

好的,沒問題! – Suren