1

MPI を使用する C++ プログラムがあり、各プロセス (最大 32) でファイルに書き込みます。プロセス全体に均等に分散された 100 個の double で構成される小さなテスト データ セットを使用しています。これまでの出力のフォーマットは次のとおりです。

  data_sink.Write(&d_p[i], 1, MPI::DOUBLE);
  data_sink.Write(&space, 1, MPI::CHAR);
  data_sink.Write(&r_p[j], 1, MPI::DOUBLE);
  data_sink.Write(&new_line, 1, MPI::CHAR);

結果を GNUPlot で直接解釈できるように、この出力をフォーマットする最良の方法は何ですか?

4

1 に答える 1

5

ここでdata_sinkは、それがMPI::File. 出力を再現できる十分なコードがあれば役に立ちます。

最初に知っておくべきことは、MPI-IO ルーチンはバイナリで出力されるということです。各値の後にスペースと改行文字を出力しても、それは変わりません。しかし、もう 1 つ知っておくべきことは、gnuplot はバイナリ ファイルを問題なく読み取ることができるということです。したがって、ここに正弦波を出力する小さな MPI-IO コードがあり、各プロセスはドメイン全体の 20 ポイントを取得します。

#include <mpi.h>
#include <cmath>

int main(int argc, char **argv) {

    int rank, size;
    const int nperrank = 20;
    double *data = new double[2*nperrank];

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

    int totnpts = nperrank * size;
    double dx = (2.*3.14159/totnpts);
    double left = rank * nperrank * dx;

    for (int i=0; i<nperrank; i++) {
        double x = left + dx*i;
        double sinx = sin(x);

        data[2*i] = x;
        data[2*i+1] = sinx;
    }

    MPI_File file;
    MPI_File_open(MPI_COMM_WORLD, "out.dat", MPI_MODE_WRONLY |  MPI_MODE_CREATE,
                    MPI_INFO_NULL, &file);

    MPI_Status status;
    MPI_File_write_at_all(file, 2*rank*nperrank*sizeof(double),
                            data, 2*nperrank, MPI_DOUBLE, &status);

    MPI_File_close(&file);

    MPI_Finalize();
    return 0;
}

そして、これを実行してプロットした出力は次のとおりです。

$ mpicxx -o io io.cc
$ mpirun -np 4 ./io
$ gnuplot

    G N U P L O T
    Version 4.2 patchlevel 6
    [...]


Terminal type set to 'x11'
gnuplot> plot 'out.dat' binary format="%lf%lf" using 1:2 with linespoints
gnuplot>

ここに画像の説明を入力

于 2013-04-14T01:37:05.557 に答える