2015-08-26 57 views
0

我已經結構是這樣的:如何發送指針結構在MPI

typedef struct 
{ 
    int x; 
    double *y; 
    int **z; 
} 
ind; 

我怎麼可能通過MPI發送指針,如* y和** Z到其他進程?我知道很多答案都表示永遠不會通過MPI發送指針。但是如果我不能將* y更改爲數組,因爲它在主程序的其他部分中使用,那麼我應該如何通過MPI通過進程傳輸它們?特別是** z,我該怎麼辦? 在此先感謝!

+0

我會想象你不能。說一個進程修改了'* y',其他進程如何知道'* y'改變了? – immibis

+4

您無法發送指針,因爲它在分配過程之外沒有意義。如果你想發送它指向的數據數組,請改用這個問題。 – Jeff

+0

對不起。我是編程新手。也許我沒有清楚地描述這個問題。我確實想發送它指向的數據數組。你能否爲此提供一點線索。非常感謝! –

回答

1

只要遵循第二個示例here的代碼,我做了以下操作。我相信這是你想要的。

#include <stdio.h> 
#include <stdlib.h> 
#include <mpi.h> 

int main(int argc, char *argv[]) { 
    int *send, *recv; 
    int rank, i; 
    MPI_Status status; 

    MPI_Init(&argc, &argv); 
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 

    send = malloc(sizeof(int)*10); 
    recv = malloc(sizeof(int)*10); 

    for (i=0;i<10;i++) 
    send[i] = 5*i; 

    if (rank == 0) 
    MPI_Send(send, 10, MPI_INT, 1, 0, MPI_COMM_WORLD); 
    else { 
    MPI_Recv(recv, 10, MPI_INT, 0, 0, MPI_COMM_WORLD, &status); 

    for (i=0;i<10;i++) 
     printf("%d\n", recv[i]); 
    } 

    MPI_Finalize(); 
    return 0; 
} 

運行它輸出,

$ mpiexec -n 2 mpi_test 
0 
5 
10 
15 
20 
25 
30 
35 
40 
45 

現在你只需要以使其適應你自己的問題。

+0

感謝您的善意幫助。如果我想構建一個MPI_struct來包含IND結構中的所有元素並將它們作爲MPI_type發送,會怎麼樣?如何處理指針?特別是,如何計算由指針指向的那些數組的MPI_address? –

+0

如果你指的是http://www.mpich.org/static/docs/v3.1/www3/MPI_Type_create_struct.html,那麼我會說你不能直接。我推薦的是創建一個單獨的函數(如果你喜歡,你可以在MPI之後建模),它將發佈你的數據結構。一堆Send/Recv/Broadcast /等。正確傳輸您的數據結構。那可行。 –

+0

您也可以通過將該函數打包到可在接收端解包的緩衝區來將該數據序列化。 –