2014-02-24 28 views
1

我需要使用的OpenMP編程用2^15大小的mpz_t陣列平行於以下代碼:使用OpenMP和mpz_t的malloc使段錯誤

#pragma omp parallel for private(j,temp3) 
for(j=Real;j<LL;j++)//l 
    { 
     for(__int64_t k=0;k<=((j/(Real*1.0))/(log(sieve[i])/log(2.0)));k++)//l5 
     { 
      if((((j/(Real*1.0)-k*(log(sieve[i])/log(2.0)))<LL))&&(((j/(Real*1.0)-k*(log(sieve[i])/log(2.0)))>0)))// can log() use __int64_t? 
       mpz_add(temp3[j],temp3[j],temp2[(int)floor((j-k*Real*(log(sieve[i])/log(2.0))))]); 
     } 
     mpz_add_ui(temp3[j],temp3[j],(int)floor(((j/(Real*1.0))/(log(sieve[i])/log(2.0))))); 
    } 

我初始陣列TEMP3像這樣:

mpz_t temp3[LL]; 

,它會導致分割fault.So我試着寫這樣的:

mpz_t *temp3=(mpz_t *)malloc(sizeof(mpz_t)*LL); 

也造成分割故障,並且malloc操作不成功。 如何解決?謝謝!

+1

你永遠不會調用'mpz_init'?你爲什麼讓temp3是私人的? –

+0

我叫mpz_init。 temp3 []可以並行獲得正確的值而不設置私有? – user3346400

+0

'private'的意思是:「爲每個線程複製它」。在這種情況下製作副本意味着什麼? –

回答

0

當temp3是一個數組(mpz_t temp3[ll])並且聲明它是私有的時,OpenMP會爲每個線程創建數組的私有版本(即它爲每個線程的堆棧分配獨立的私有內存)。但是,在第二種情況下,使用malloc temp3只是一個指針(數組和指針不是同一件事),並且當您傳遞一個私有指針時,OpenMP僅爲每個線程(它不分配內存)指定私有版本的指針。

在第一種情況下,崩潰可能是由於陣列大於堆棧大小。在第二種情況下,指針的私有版本從不初始化(因爲它們將與firstprivate一起使用),因此它們指向可能導致崩潰的未知內存地址。

解決方案很簡單。 請勿私自申報temp3。它應該被共享。

如果您使用firstprivate,您可以嘗試將temp3保留爲私有,但我不認爲這是個好主意。

#include <stdio.h> 
#include <stdlib.h> 
int main() { 
    int x[10]; 
    printf("%p\n", x); 
    #pragma omp parallel private(x) 
    { 
     printf("%p\n", x); 
    } 

    int* y = (int*)malloc(10*sizeof(int)); 
    #pragma omp parallel firstprivate(y) 
    { 
     printf("%p\n", y); 
    } 
}