2015-03-04 4 views
0

Я написал простую программу MPI. Я не делаю никакой обработки в программе. Он просто имеет скелет MPI и строки для чтения переменной. Тем не менее, программа повесилась во время работы. Он печатает несколько строк новой строки, а затем вешает навсегда.MPI: Программа висит на scanf

int main(int argc, char* argv[]) { 
    int my_rank; /* rank of process */ 
    int p; /* number of processes */ 
    int tag = 0; /* tag for messages */ 
    long N; 
    MPI_Status status; /* return status for receive */ 

    /* start up MPI */ 
    MPI_Init(&argc, &argv); 

    /* find out process rank */ 
    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); 

    /* find out number of processes */ 
    MPI_Comm_size(MPI_COMM_WORLD, &p); 


    printf("\nEnter the number of random points to generate: "); 
    scanf("%ld", &N); 

    if (my_rank == 0) { 

    } 

    /* shut down MPI */ 
    MPI_Finalize(); 

    return 0; 
} 
+0

Итак, что произойдет, если вы удалите вызовы MPI? – unwind

+0

Проблема Решена путем промывки этажа. Не знаю, почему это вызвало проблему. – Kany

ответ

2

Если вы с помощью Eclipse, для параллельного программирования, то (скорее всего), что является причиной проблемы.
Это какой-то глюк в PTP. Вы также можете испытать это с помощью printf, оно печатается только после того, как ваша программа завершила выполнение или была отключена (а не во время работы программы).
Затем попробуйте запустить код из командной строки, он будет работать.

Если он все еще получает повешен или вы не используете Eclipse, для параллельного программирования,
затем попробуйте позвонить fflush(stdout) или while ((c = getchar()) != '\n' && c != EOF);, чтобы очистить все, прежде чем читать пользовательский ввод.

0

scanf читает функцию из STDIN и магазинов, что в переменной выбора, в вашем случае N.

Когда вы пишете программу MPI, код после MPI_INIT выполняется каждым процессом самостоятельно.

Он будет работать нормально до утверждения printf (каждый процесс будет выполнять printf параллельно). Когда он встречает scanf, программа останавливает выполнение, так как теперь он ожидает ввода из STDIN, который не предоставляется.

+0

Этот ответ не является точным для большинства библиотек MPI. Даже если вы поместите код до 'MPI_INIT', для большинства реализаций он будет выполняться один раз для каждого процесса. Правильный способ обработки ввода пользователем в MPI - использовать файлы или аргументы командной строки вместо 'stdin'. –

0

Проблема была решена путем промывки стандартного вывода.

Смежные вопросы