Mpi 使用消息传递接口发送字符串数组

Mpi 使用消息传递接口发送字符串数组,mpi,mpj-express,Mpi,Mpj Express,我想使用消息传递接口(MPI)将一个字符串数组从主线程发送到从线程。 i、 e.字符串[]str=新字符串[10] str[0]=“XXX”。。。等 如何在避免将此数组中的每个元素作为字符链发送的同时做到这一点 我在一次发送操作中成功发送了一个整数数组。。。但是我不知道如何处理字符串数组的问题,我不懂Java,但是我会给你C的答案。不过,这些概念——特别是解决这个问题的两种方法——在任何语言中都是相同的 想象一下,如果这是一个简单的c字符串(某些字符以“\0”结尾)。有两种方法: 过度配置内存并

我想使用消息传递接口(MPI)将一个字符串数组从主线程发送到从线程。 i、 e.字符串[]str=新字符串[10] str[0]=“XXX”。。。等

如何在避免将此数组中的每个元素作为字符链发送的同时做到这一点


我在一次发送操作中成功发送了一个整数数组。。。但是我不知道如何处理字符串数组的问题,我不懂Java,但是我会给你C的答案。不过,这些概念——特别是解决这个问题的两种方法——在任何语言中都是相同的

想象一下,如果这是一个简单的c字符串(某些字符以“\0”结尾)。有两种方法:

  • 过度配置内存并接收到一定的限制
  • 或者发送一条消息,指示需要多少数据 你有最大长度吗?(例如PATH_MAX或类似的东西)。如果您不需要每个字节的内存,您可以这样做

    MPI_Send(str, strlen(str), MPI_CHAR, slave_rank, slave_tag, MPI_COMM_WORLD);
    
    你会把它和

    MPI_Recv(str, MAX_LENGTH, MPI_CHAR, master_rank, slave_tag, MPI_COMM_WORLD);
    
    如果您不喜欢在末尾添加slop,则必须在两条消息中执行此操作:

    len=strlen(str) + 1;  /* +1 for the NULL byte */
    MPI_Send(&len, 1, MPI_INT, slave_rank, slave_tag, MPI_COMM_WORLD);
    MPI_Send(str, strlen(str), MPI_CHAR, slave_rank, slave_tag, MPI_COMM_WORLD);
    
    你会把它和

    MPI_Recv(&len, 1, MPI_INT, master_rank, slave_tag, MPI_COMM_WORLD);
    payload= malloc(len);
    MPI_Recv(&payload, len, MPI_CHAR, master_rank, slave_tag, MPI_COMM_WORLD);
    

    发送字符串数组,特别是在大小不同的情况下,是一个相当复杂的过程。有几个选项,但最适合MPI的选项是使用MPI的打包和解包功能,在mpiJava中公开为
    Comm.Pack
    Comm.Unpack
    、和
    Comm.Pack\u size

    你可以这样做:

    发件人
    byte[][]字节=新字节[nStr][];
    int[]长度=新的int[nStr];
    int bufLen=MPI.COMM\u WORLD.Pack\u大小(1,MPI.int);
    bufLen+=MPI.COMM\u WORLD.Pack\u大小(nStr,MPI.INT);
    对于(int i=0;i
    在辅助数组中设置字符串长度并将其打包在消息的开头可以简化接收器逻辑

    接受者 假设发送方的级别为0

    Status Status=MPI.COMM\u WORLD.Probe(0,0);
    int bufLen=状态获取计数(MPI.PACKED);
    字节[]buf=新字节[bufLen];
    MPI.COMM_WORLD.Recv(buf,0,bufLen,MPI.PACKED,status.source,status.tag);
    int位置=0;
    int nStrArray[]=新int[1];
    位置=MPI.COMM_WORLD.Unpack(buf,位置,
    nStrArray,0,1,MPI.INT);
    int nStr=nStrArray[0];
    整数长度[]=新整数[nStr];
    位置=MPI.COMM_WORLD.Unpack(buf,位置,
    长度,0,nStr,MPI.INT);
    字符串[]str=新字符串[nStr];
    对于(int i=0;i

    免责声明:我没有安装MPJ Express,而且我的Java知识非常有限。代码基于、和Internet上的一些内容。

    问题是关于Java中的MPI实现。除非Java MPI实现有一些奇特的字符串对象,否则想法仍然是一样的。您只需将strlen(str)
    更改为
    str.length()
    .Hristo,谢谢您向我指出这一点。我编辑了我的答案,以明确我对Java一无所知。非常感谢你所有详细的答案。。。。昨天,我发现了一个用java实现的非常简单的方法。。。只需将字符串Arrayy转换为对象数组,然后发送数组对象的长度:MPI.COMM_WORLD.Isend(ObjectArray、index、ObjectArray.length、MPI.Object、rank、tag)@StudyLearn,真希望在我在答案中输入所有代码之前,我能看到你的评论:)哦,这真是一种聪明的方式。。虽然我找到了一个简短的答案,但我学会了一种打包和解包发送给接收方的数据的好方法:)我将把它包括在我的实现中:)