#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, который освобождает выделенную память, у вас будет некоторая утечка памяти.