vru*_*e21 1 c++ gnuplot mpi mpi-io
我有一个使用MPI的C++程序,我希望每个进程(最多32个)写入文件.我正在使用一个小的测试数据集,其中包含100个双重均匀分布在整个过程中的数据集.到目前为止,输出的格式如下:
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);
Run Code Online (Sandbox Code Playgroud)
格式化此输出的最佳方法是什么,以便GNUPlot可以直接解释结果?
我假设这data_sink是一个MPI::File.足够的代码能够重现您的输出会很有帮助.
首先要知道的是MPI-IO例程以二进制形式输出; 在每个值之后输出空格和换行符不会改变它.但另一件需要知道的是,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;
}
Run Code Online (Sandbox Code Playgroud)
这是运行它和绘图的输出:
$ 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>
Run Code Online (Sandbox Code Playgroud)
