c++ - GNUPlot 的 MPI IO 格式化

标签 c++ mpi gnuplot mpi-io

我有一个使用 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 可以直接解释结果的最佳方法是什么?

最佳答案

我在这里假设 data_sink 是一个 MPI::File。足够的代码能够重现您的输出会很有帮助。

首先要知道的是MPI-IO例程以二进制形式输出;在每个值之后输出空格和换行符不会改变这一点。但要知道的另一件事是 gnuplot can read binary files just fine .所以这是一个输出正弦波的小 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>

enter image description here

关于c++ - GNUPlot 的 MPI IO 格式化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15994675/

相关文章:

c++ - 使用并行 I/O 复制大数据文件

pdf-generation - gnuplot 中的 pdfcairo 'unknown or ambiguous terminal type'

c++ - 如果存在字符串则设置 bool 值

c++ - 调用 join 后删除 std::thread?

c++ - 来自环形拓扑的全局最大值,而不是来自 C++ 中的 MPI_REDUCE

c - Gnuplot : Hide the window

linux - gnuplot 加载在 bash 脚本中不起作用

c++ - 比较 Google Test 或 Google Mock 中的特征矩阵

c++11 结合 std::tuple 和 std::tie 以实现高效排序

r - doMPI 和集群