В предыдущем примере некоторые значения были жестко определены в коде программы. Чаще всего для таких случаев возникает дополнительная задача обеспечения ввода требуемых величин со стороны пользователя.
Как правило, при обеспечении работы с терминалом вывод и ввод осуществляется через один процесс. Чаще всего это процесс с номером 0. В общем случае, все процессы могут осуществлять ввод / вывод, однако при одновременном выполнении операторов ввода / вывода могут возникать неожиданные эффекты. Поэтому наилучшим вариантом является обеспечение интерфейса через один процесс.
Пусть для примера обмен осуществляется через процесс 0. Необходимо передать другим процессам значения левой и правой границ интервала и количества трапеций. Для этого может использоваться следующая функция:
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 */