2015-08-26 126 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

您也可以通过将该函数打包到可在接收端解包的缓冲区来将该数据序列化。 –