Форматирование MPI IO для GNUPlot

У меня есть программа на C ++ с использованием MPI, где я хотел бы, чтобы каждый процесс (до 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);

Каков наилучший способ отформатировать этот вывод, чтобы результат можно было напрямую интерпретировать GNUPlot?

1

Решение

Я предполагаю, что здесь 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;
}

И вот результат запуска и построения графика:

$ 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>

введите описание изображения здесь

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]