2016-01-20 159 views
0

我有以下代碼:MPI_SEND雙指針

double * myX; 
double * myY; 
double * myZ; 
int amount; 
int count;  // number of process 

void SomeClass::someMethod(double *x, double *y, double *z, int amount) { 

    if (myId == 0) { 
     myX = x; 
     myY = y; 
     myZ = z; 
     amount = amount; 
     for(int i = 1; i < count; ++i) { 
      MPI_Send(&amount, 1, MPI_INT, i, 0, MPI_COMM_WORLD); 
      MPI_Send(myX, amount, MPI_DOUBLE, i, 0, MPI_COMM_WORLD); 
      MPI_Send(myY, amount, MPI_DOUBLE, i, 0, MPI_COMM_WORLD); 
      MPI_Send(myX, amount, MPI_DOUBLE, i, 0, MPI_COMM_WORLD); 
     } 
    }           
} 

void SomeClass::anotherMethod(void) { 

    if(myId != 0) { 
     MPI_Recv(&amount, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); 
     MPI_Recv(myX, amount, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); 
     MPI_Recv(myY, amount, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); 
     MPI_Recv(myZ, amount, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);   
    } 

    // rest of code 
    MPI_Reduce(args); 
} 

但我有問題,因爲我得到Null buffer pointer當我運行該代碼或Segmentation fault當我改變的東西,例如設置&之前變數名稱,然後運行。

MPI_init和其他所需的函數在其他類中被調用,其中我也創建了這個類對象。

有人可以幫助我嗎?

+1

你的問題會比較清楚你代碼產生了錯誤:您的許多MPI調用中的哪一個會導致「空緩衝區指針」? 'Segmentation fault'是從哪一行拋出的? – Edward

+0

@愛德華權利,這是當我嘗試從雙數組中獲取數據。 –

回答

3

MPI_RECV將它接收到的數據複製到由(在下面的情況下MYX)所述第一參數指定的緩衝液:

MPI_Recv(myX, amount, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); 

的問題是,您還沒有創建一個緩衝器來存儲此。

你可以這樣做:

myX = new double[amount]; 

例如創建緩衝區,不忘再次釋放內存之後用:如果你解釋的哪一部分

delete[] myX; 
+0

感謝您的好答案。其實這是一個錯誤。 –