next up previous contents
Next: Коллективные коммуникации Up: Пример приложения с обменом Previous: Параллелизация правила трапеции   Contents

Ввод / вывод для параллельных процессоров

В предыдущем примере некоторые значения были жестко определены в коде программы. Чаще всего для таких случаев возникает дополнительная задача обеспечения ввода требуемых величин со стороны пользователя.

Как правило, при обеспечении работы с терминалом вывод и ввод осуществляется через один процесс. Чаще всего это процесс с номером 0. В общем случае, все процессы могут осуществлять ввод / вывод, однако при одновременном выполнении операторов ввода / вывода могут возникать неожиданные эффекты. Поэтому наилучшим вариантом является обеспечение интерфейса через один процесс.

Пусть для примера обмен осуществляется через процесс 0. Необходимо передать другим процессам значения левой и правой границ интервала и количества трапеций. Для этого может использоваться следующая функция:

void Get_data(int my_rank, int p, float* a_ptr,

     float* b_ptr, int* n_ptr)

{

  int source = 0; /* Локальные переменные */

  int dest; /* используемые MPI_Send и MPI_Recv */

  int tag; 

  MPI_Status status;

 

  if (my_rank == 0) {

     printf(''Введите a, b, и n\n'');

     scanf(''%f %f %d'', a_ptr, b_ptr, n_ptr);

     for (dest = 1; dest < p; dest++) {

        tag = 30;

        MPI_Send(a_ptr, 1, MPI_FLOAT, dest, tag,

            MPI_COMM_WORLD);

        tag = 31;

        MPI_Send(b_ptr, 1, MPI_FLOAT, dest, tag,

            MPI_COMM_WORLD);

        tag = 32;

        MPI_Send(n_ptr, 1, MPI_INT, dest, tag,

            MPI_COMM_WORLD);

     }

  } else {

     tag = 30;

     MPI_Recv(a_ptr, 1, MPI_FLOAT, source, tag,

         MPI_COMM_WORLD, &status);

     tag = 31;

     MPI_Recv(b_ptr, 1, MPI_FLOAT, source, tag,

        MPI_COMM_WORLD, &status);

     tag = 32;

     MPI_Recv(n_ptr, 1, MPI_INT, source, tag,

        MPI_COMM_WORLD, &status);

  }

}/* Get_data */



2004-06-22