Главная /
Параллельное программирование с OpenMP /
Найдите ошибку в следующем фрагменте MPI/OpenMP-программы, реализующей метод релаксации Якоби: int jacobi(int p, int id, int my_rows, double **u, double **w) { double diff, global_diff, tdiff; int i,j,it; MPI_Status status; it=0; #pragma omp parallel priv
Найдите ошибку в следующем фрагменте MPI/OpenMP-программы, реализующей метод релаксации Якоби:
int jacobi(int p, int id, int my_rows, double **u, double **w) {
double diff, global_diff, tdiff;
int i,j,it;
MPI_Status status;
it=0;
#pragma omp parallel private (i,j,tdiff)
{
for(;;) {
#pragma omp master
{
diff=0.0;
if (id>0) MPI_Send (u[1], N, MPI_DOUBLE, id-1, 0, MPI_COMM_WORLD);
if (id<p-1) {
MPI_Send (u[my_rows-2], N, MPI_DOUBLE, id+1, 0, MPI_COMM_WORLD);
MPI_Recv (u[my_rows-1], N, MPI_DOUBLE, id+1, 0, MPI_COMM_WORLD, &status);
}
if (id>0) MPI_Recv (u[0], N, MPI_DOUBLE, id-1, 0, MPI_COMM_WORLD, &status);
} /*end of master*/
tdiff=0.0;
#pragma omp for
for (i=1; i<my_rows; i++)
for (j=1; j<N-1; j++) {
w[i][j]=(u[i-1][j]+u[i+1][j]+u[i][j-1]+u[i][j+1])/4.0;
if (fabs(w[i][j]-u[i][j]) >tdiff) tdiff=fabs(w[i][j]-u[i][j]);
}
#pragma omp for nowait
for (i=1; i<my_rows; i++)
for (j=1; j<N-1; j++)
u[i][j]=w[i][j];
#pragma omp critical
if (tdiff > diff) diff=tdiff;
#pragma omp barrier
#pragma omp single
{
it++;
MPI_Allreduce (&diff, &global_diff, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD);
} /*end of single*/
if (global_diff <= EPSILON) break;
}
return it;
}
вопрос
Правильный ответ:
не определен класс для переменных
my_rows, diff, id, p, status, u, w, it, global_diff
, используемых в параллельной области -shared(my_rows,diff,diff,id,p,status,u,w,it,global_diff)
отсутствует барьерная синхронизация нитей (директива
barrier
) по завершении конструкции master
в данном фрагменте программы ошибки нет
Сложность вопроса
30
Сложность курса: Параллельное программирование с OpenMP
28
Оценить вопрос
Комментарии:
Аноним
Экзамен сдан на 4 с минусом. Ура
18 май 2018
Аноним
Я сотрудник университета! Незамедлительно сотрите сайт vtone.ru с ответами с интуит. Не ломайте образование
04 ноя 2017
Другие ответы на вопросы из темы программирование интуит.
- # PRAM модель консистентности памяти определяется следующим условием:
- # Способ распределения витков цикла между нитями группы задается при помощи клаузы schedule(<алгоритм планирования>[,<число итераций>]). Найдите ошибку в следующем фрагменте программы: #pragma omp parallel default(shared) { int i; #pragma omp for schedule(dynamic, omp_get_thread_num()) for (i=0; i<n; i++) { work(i); } }
- # Найдите ошибку в следующем фрагменте программы: int numt=0; #pragma omp parallel { #pragma omp single { #pragma omp critical { numt=omp_get_num_threads(); } #pragma omp barrier } }
- # Выберите наиболее походящую оптимизацию, которая позволит сократить время выполнения следующего фрагмента программы: #define N 80 omp_set_num_threads (8); #pragma omp parallel shared(a,b,c,x,y,z) { #pragma omp for for (int i=0; i<N; i++) { z[i] = x[i] + y[i]; } #pragma omp for for (int i=0; i<N; i++) { a[i] = b[i] + c[i]; } }
- # Найдите ошибку в следующем фрагменте MPI/OpenMP-программы, вычисляющей число Пи: #include <mpi.h> #include <omp.h> #define num_steps 100000 void main (int argc, char *argv[]) { int numprocs, myid, mysteps; double pi, step, sum = 0.0 ; MPI_Init(&argc, &argv) ; MPI_Comm_Rank(MPI_COMM_WORLD, &myid) ; MPI_Comm_Size(MPI_COMM_WORLD, &numprocs) ; step = 1.0/(double) num_steps ; mysteps = num_steps/numprocs ; #pragma omp parallel shared(myid, mysteps, step) reduction(+:sum) { #pragma omp for for (int i=myid*mysteps; i<(myid+1)*mysteps ; i++){ double x = (i+0.5)*step; sum += 4.0*step/(1.0+x*x); } MPI_Reduce(&sum, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); } MPI_Finalize(); }