Как мне запретить другим процессам выполнять определенные строки кода?

#c #mpi

#c #mpi

Вопрос:

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

Я пытался поместить все под an if (rank == 0) , но код, похоже, не работает.

 int main(int argc, char* argv[])
{

    int num_procs, my_id;
    int *count, *disp;

    MPI_Init(amp;argc, amp;argv);
    MPI_Comm_rank(MPI_COMM_WORLD, amp;my_id);
    MPI_Comm_size(MPI_COMM_WORLD, amp;num_procs);

    int i, j, N, k;
    double u, l, h;
    double *A, *b1, *b2, *x, *xo, x1bound, x2bound, y1bound, y2bound;
    double norm, sum, dot, tmp;

    l = -10;
    u = 10;
    h = 0.5;
    tmp = (u-l)/h;
    N = floor(tmp);

    A = (double*)calloc(N*N,sizeof(double));
    b1 = (double *)calloc(N,sizeof(double));
    x = (double *)malloc(sizeof(double)*N);
    xo = (double *)malloc(N*sizeof(double));
    for (i = 0; i < N; i  )
     xo[i] = 0.0;

    count = (int*) calloc(num_procs, sizeof(int));
    disp = (int*) calloc(num_procs, sizeof(int));

    A[0] = -2.0;
    A[1] = 1.0;
    for (i = 1; i < N; i  )
      {
        A[i*N i] = -2.0;
        A[i*N i 1] = 1.0;
        A[i*N i-1] = 1.0;
      }
    for (i = 0; i < N; i  )
      b1[i] = (l   i*h);

    func(amp;b1, N, h);
    x1bound = 0;
    y1bound = 0;
    x2bound = 1;
    y2bound = 0;

    i = index_of(x1bound, l, h);
    A[i*N i] = 1.0;
    A[i*N i 1] = 0.0;
    A[i*N i-1] = 0.0;
    b1[i] = y1bound;

    i = index_of(x2bound, l, h);
    A[i*N i] = 1.0;
    A[i*N i 1] = 0.0;
    A[i*N i-1] = 0.0;
    b1[i] = y2bound;

    k = 0;
    norm = INF;
    while (norm > EPS)
      {
        dot = 0.0;
        MATVEC(N,N,A,xo,amp;b2,num_procs,my_id,count,disp,MPI_COMM_WORLD);
        for (i = 0; i < N; i  )
          {         
            x[i] = (b1[i] - b2[i])/(A[i*N i]);
            dot  = (x[i] - xo[i])*(x[i] - xo[i]);
          }
        for (i = 0; i < N; i  )
          xo[i] = x[i];
        printf("from %d dot = %lfn",my_id,dot);
        norm = sqrt(dot);
        k  ;
        MPI_Bcast(xo,N,MPI_DOUBLE,0,MPI_COMM_WORLD);
        MPI_Barrier(MPI_COMM_WORLD);
      }
        if(my_id == 0);
        {
          printf("After %d operations we obtainedn", k);
          for(i = 0; i < N; i  )
            printf("%lfn", x[i]);

        free(x); free(xo);
        free(b1); free(b2);
        free(A);
        }

    MPI_Barrier(MPI_COMM_WORLD);
    MPI_Finalize();
}
  

Комментарии:

1. if (rank == 0) по сути, это ваш единственный вариант здесь. Предполагая MATVEC , что все процессы должны вызываться только всеми процессами, тогда все процессы должны войти в while(norm > EPS) цикл, и все они будут одинаковыми norm при вычислении условия.

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