Главная /
Параллельное программирование с 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; for(;;) { if (id>0) MP
Найдите ошибку в следующем фрагменте 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;
for(;;) {
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);
diff=0.0;
#pragma omp parallel private (i,j,tdiff)
{
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;
MPI_Allreduce (&diff, &global_diff, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD);
}
if (global_diff <= EPSILON) break;
it++;
}
return it;
}
вопрос
Правильный ответ:
не определен класс для переменных
u, w, my_rows, diff, global_diff
, используемых в параллельной области -shared(u,w,my_rows,diff,global_diff)
обращения к функции
MPI_Allreduce
в параллельной области должны выполняться одной нитью (например, внутри конструкции single
)
в данном фрагменте программы ошибки нет
Сложность вопроса
83
Сложность курса: Параллельное программирование с OpenMP
28
Оценить вопрос
Комментарии:
Аноним
Спасибо за ответы интуит
04 дек 2017
Аноним
Какой человек ищет данные ответы интуит? Это же элементарно
03 мар 2017
Аноним
Это очень нехитрый решебник интуит.
17 дек 2016
Другие ответы на вопросы из темы программирование интуит.
- # Найдите ошибку в следующем фрагменте программы: #define N 10 int A[N], sum; #pragma omp parallel default(shared) num_threads(10) { int iam=omp_get_thread_num(); #pragma omp critical (update_a) #pragma omp critical (update_a) sum +=A[iam]; }
- # Пусть следующая программа скомпилирована компилятором, поддерживающим вложенный параллелизм. #include <stdio.h> #include "omp.h" int counter; int main() { counter=0; omp_set_nested(0); #pragma omp parallel num_threads(2) { if (omp_get_thread_num() == 0) { #pragma omp parallel num_threads(2) { #pragma omp atomic counter++; } } } printf("Counter=%d\n",counter); } Определите значение переменной counter по завершении выполнения этой программы:
- # Определите значение переменной team_size по завершении выполнения следующей программы: #include <stdio.h> #include "omp.h" int main() { int team_size; team_size=0; #pragma omp parallel num_threads(2) { if (omp_get_thread_num() == 0) { team_size=omp_get_team_size(0); } } printf("Team Size=%d\n",team_size); }
- # Найдите ошибку в следующем фрагменте программы: #define N 1000 int main (void){ float a[N]; #pragma omp parallel { #pragma omp for for(int i=0; i<N;i++) { float tmp; tmp= a[i]*a[i]; a[i]=1-tmp; } } }
- # При использовании технологии Intel Cluster OpenMP программист: