печать результата один раз в MPI - PullRequest
2 голосов
/ 07 марта 2012

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

MPI_Bcast(vec,W,MPI_INT,0,MPI_COMM_WORLD);

col_count = myrank;
for(k=0; k<W; k++)
{
    res[col_count]+= vec[k]*matrix[k*W+col_count];
}

MPI_Barrier(MPI_COMM_WORLD);
printf("%d ",res[c]);
MPI_Finalize();

Ответы [ 2 ]

3 голосов
/ 07 марта 2012

Если вы хотите, чтобы все было в порядке, вы должны печатать только из одного процесса.Это означает, что вы должны собрать весь свой вектор результатов обратно в процесс 0, а затем распечатать его.

MPI_Gather (&(res[col_count]), 1, MPI_INT, res, 1, MPI_INT, 0, MPI_COMM_WORLD);
for (int i=0 ; i<col_max ; ++i) {
  printf ("%f\n", res[i]);
}

Обратите внимание, что процесс 0 должен иметь полный вектор res (и вы должны позаботиться о том, чтобывыделите его перед вызовом MPI_Gather), но в вашем примере все другие процессы используют только res[col_count], поэтому вам лучше выделить для них только один int.

2 голосов
/ 07 марта 2012

Вы ищете MPI_Comm_rank.Затем добавьте охрану, чтобы разрешить печать только одного определенного ранга.Ранг 0 является одним очевидным выбором для печати.

MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if(rank == 0) {
    printf ("Hello world! I'm rank %d\n", rank);
}
...