-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();
  }
}   

バイト配列は良い解決策でしょうか?

ベンチマークの結果を支援するために固定サイズのメッセージが必要

編集 :

これはうまくいきますか?これは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などを使用することもできます。これらは複雑さを増すだけでなく機能も追加し、それぞれがそのアプリケーション分野で強力です。

于 2013-03-23T20:19:12.057 に答える