-2

我如何在 java 中发送 1kb 的消息,我试图从一台机器向另一台机器发送一条固定大小为 1kb 的消息,如何实现?

目前我能够在机器之间发送诸如“测试”之类的消息,但理想情况下我希望能够发送 1kb 的固定大小的消息

这就是我目前发送测试的方式

   if (myrank == 0) {
    char[] mess = " test ".toCharArray();
    MPI.COMM_WORLD.Send(mess, 0, mess.length, MPI.CHAR, 1, 99);
} 

目前这是我在机器之间发送消息的方式:

import mpi.* ;

class Hello {

  static public void main(String[] args) {
    MPI.Init(args);
int myrank = MPI.COMM_WORLD.Rank();
long startTime = System.currentTimeMillis();
if (myrank == 0) {
    char[] mess = " test ".toCharArray();
    MPI.COMM_WORLD.Send(mess, 0, mess.length, MPI.CHAR, 1, 99);
} else {
    char[] mess = new char[20];
    MPI.COMM_WORLD.Recv(mess, 0, 20, MPI.CHAR, 0, 99);
    System.out.println("received:" + new String(mess));
}

long endTime = System.currentTimeMillis();
long duration = endTime - startTime;
System.out.println(duration);
    MPI.Finalize();
  }
}   

字节数组会是一个好的解决方案吗?

需要固定大小的消息,以帮助基准测试结果,例如,我希望比较发送 1kb 消息、1mb、20mb ........ 1gb 等所花费的时间增加

编辑 :

这行得通吗?这会发送8位吗?

int i = 10;  

String text = String.format("%08d", i);  
// text now contains "00000010"  
// 8 bits
4

2 回答 2

1

如果要发送 1kb 的消息,请创建大小为 1kb 的消息并发送。

import mpi.* ;

class Hello {

    static public void main(String[] args) {

        MPI.Init(args);
        int myrank = MPI.COMM_WORLD.Rank();
        int tag = 99;

        long startTime = System.currentTimeMillis();
        if (myrank == 0) {
            char[] mess = new char [1024];
            MPI.COMM_WORLD.Send(mess, 0, mess.length, MPI.CHAR, 1, tag);
        } else if (myrank == 1) {
            char[] mess = new char[1024];
            MPI.COMM_WORLD.Recv(mess, 0, 1024, MPI.CHAR, 0, tag);
            System.out.println("received:" + new String(mess));
        }

        long endTime = System.currentTimeMillis();
        long duration = endTime - startTime;
        System.out.println(duration);
        MPI.Finalize();
    }
}

更好的是,测量乒乓延迟,这是更好的定义(往返返回时间),并使用几个长度:

import mpi.* ;

class Hello {

    static public void main(String[] args) {

        MPI.Init(args);
        int myrank = MPI.COMM_WORLD.Rank();
        int tag = 99;
        int maxlen = 512*1024*1024;
        int minlen = 64;
        char [] sendbuff = new char [maxlen];
        char [] recvbuff = new char [maxlen];


        if (myrank == 0) {
            for (int len = minlen; len < maxlen; len *= 4) {
                long startTime = System.currentTimeMillis();                    
                 MPI.COMM_WORLD.Send(sendbuff, 0, len, MPI.CHAR, 1, tag);
                 MPI.COMM_WORLD.Recv(recvbuff, 0, len, MPI.CHAR, 1, tag);
                long endTime = System.currentTimeMillis();
                long duration = endTime - startTime;
                System.out.println("Ping-pong time for " + len + " is " + duration);
            }
        } else if (myrank == 1) {
            for (int len = minlen; len < maxlen; len *= 4) {
                 MPI.COMM_WORLD.Recv(recvbuff, 0, len, MPI.CHAR, 0, tag);
                 MPI.COMM_WORLD.Send(recvbuff, 0, len, MPI.CHAR, 0, tag);
            }
        }


        MPI.Finalize();
    }
}
于 2013-03-24T03:24:02.077 回答
0

在发送(发起)端使用Socket ,在接收(监听消息)端使用ServerSocket 。Socket 允许打开输出流,ServerSocket 可以生成另一个 Socket,您可以在其中打开输入流。消息是否固定大小并没有太大区别。

也可以使用SOAP、RMI、Protocol Buffers、CORBA、MPI之类,google。这些将增加更多的复杂性,但也会增加功能,并且每个都在其应用领域中很强大。

于 2013-03-23T20:19:12.057 回答