Сериализация тем MPI - PullRequest
       43

Сериализация тем MPI

0 голосов
/ 05 июля 2011

Есть ли способ сериализации определенной части вашего кода MPI?Например, при выводе информации на экран.Примерно так:

MPI_SERIALIZE();

cerr << "THIS WILL BE PRINTED ";
cerr << "IN ORDER" << endl;

MPI_END_SERILIZE();

Если есть два потока MPI, не будет ни одного случая:

THIS WILL BE PRINTED THIS WILL BE PRINTED IN ORDER 
IN ORDER

Спасибо

Ответы [ 3 ]

2 голосов
/ 05 июля 2011

То, как я делаю это в демонстрационных программах (и обратите внимание - вы бы только делали это в небольших демонстрационных программах из-за высокой стоимости синхронизации; если вы пытаетесь контролировать вывод в файл данных, вы бы использовали MPI-IO, и если вы пытаетесь координировать вывод на терминал, проще всего отправить данные на задание 0 и сделать так, чтобы он выполнил весь вывод), это перебрать барьеры, что-то вроде этого:

#include <iostream>
#include <mpi.h>

using namespace std;

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

    int rank, size;
    int ierr;

    ierr = MPI_Init(&argc, &argv);

    ierr = MPI_Comm_size(MPI_COMM_WORLD, &size);
    ierr = MPI_Comm_rank(MPI_COMM_WORLD, &rank);

    for (int i=0; i<size; i++)
    {
        if (i == rank) {
            cout << "Hello from task " << rank << " of "
                 << size << " world!" << endl;
        }
        MPI_Barrier(MPI_COMM_WORLD);
    }

    MPI_Finalize();

    return 0;
}

(И, что еще менее важно, MPI не имеет потоков, у него есть процессы. Это может показаться небольшой деталью, но если вы начнете комбинировать MPI с OpenMP, например, различие между потоками и процессами станет важным. )

1 голос
/ 05 июля 2011

Ничего подобного нельзя явно указать с помощью MPI.Однако вы можете использовать MPI_Gather, чтобы собрать нужные вещи / значения в одном процессе и распечатать их там по порядку.

0 голосов
/ 12 июля 2012

Я бы не рекомендовал выводить что-либо на другие узлы, кроме главного, так как - в зависимости от используемой вами платформы - подчиненные узлы могут быть не в состоянии обрабатывать вывод.Поэтому, хотя это и неприятно, вам придется собрать всю информацию, которая будет распечатана на главном узле.

...