При запуске моего кода в MPI, корневой процесс никогда не выполняется, несмотря на соблюдение правильного синтаксиса - PullRequest
0 голосов
/ 03 апреля 2019

При попытке выполнить мой код, написанный на C, с использованием библиотеки MPI, я столкнулся с чем-то очень странным.Мой код еще не генерирует синтаксическую ошибку, когда я пытаюсь

 mpirun -n 3 ./q4

Я получаю это

hello
hello
hello
from the other side.
from the other side.
from the other side.

Кажется, он никогда не входит в процесс ранга 0.Я понятия не имею, почему это происходит.Этот код структурно идентичен некоторым другим образцам, которые я написал (я могу предоставить весь код, если это необходимо). Однако, если бы я должен был ввести любые две случайные вещи после шестой строки, я получил бы это

1213
123
Enter a length for the string that is divisible by the number of processes Number of vowels 27 

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

int main(int argc, char * argv[])
{
 printf("hello\n");
 int rank,m,size,num;
 MPI_Init(&argc,&argv);
 MPI_Comm_rank(MPI_COMM_WORLD,&rank);
 MPI_Comm_size(MPI_COMM_WORLD,&size);
 printf("from the other side.\n");
 char str[100];
 if (rank == 0 )
 {
  printf("Enter a length for the string that is divisible by the number of processes ");
  scanf("%d",&m);
  scanf("%s",str);
 }
.
.

Если это актуально, я запускаю Ubuntu 18.04.

Ответы [ 2 ]

2 голосов
/ 03 апреля 2019

Вам нужно добавить немного fflush(stdout); после последнего printf, чтобы принудительно обновить текст.

Если в тексте printf нет \n, текст отображается не сразу.

Итак, вы должны написать:

printf("Enter a length for the string that is divisible by the number of processes ");
fflush(stdout);
scanf("%d",&m);
....

Или проще:

puts("Enter a length for the string that is divisible by the number of processes ");
scanf("%d",&m);
....

puts - напечатать сообщение в строке (оно создает новую строку). И это не буферизовано.

0 голосов
/ 03 апреля 2019

В случае, если кто-нибудь когда-нибудь прочтет это в будущем, это добавит к тому, что сказал Матье. Код должен быть таким

 if (rank == 0 )
 {
  printf("Enter a length for the string that is divisible by the number of processes \n");
    fflush(stdout);
.
.
.
...