Главная /
Параллельное программирование с OpenMP /
Найдите ошибку в следующем фрагменте 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
Найдите ошибку в следующем фрагменте 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)
{
#pragma omp for reduction(+:sum)
for (int i=myid*mysteps; i<(myid+1)*mysteps ; i++){
double x = (i+0.5)*step;
sum += 4.0 /(1.0+x*x);
}
sum *= step ;
}
MPI_Reduce(&sum, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
MPI_Finalize();
}
вопрос
Правильный ответ:
функции
MPI_Init
, MPI_Comm_Rank
, MPI_Comm_Size
и MPI_Reduce
должны вызываться из параллельной области
конфликт доступа к данным (
race condition
), возникающий в результате выполнения оператора sum *= step
в параллельной области
в данном фрагменте программы ошибки нет
Сложность вопроса
57
Сложность курса: Параллельное программирование с OpenMP
28
Оценить вопрос
Комментарии:
Аноним
Какой человек ищет данные ответы интуит? Это же элементарно (я не ботан)
22 дек 2020
Аноним
Экзамен прошёл на 5. Спасибо сайту
15 июл 2019
Другие ответы на вопросы из темы программирование интуит.
- # Рассмотрим фрагмент OpenMP-программы: #include <omp.h> int main (void) { omp_set_nested(0); omp_set_max_active_levels(8); omp_set_num_threads(2); #pragma omp parallel { omp_set_num_threads(2); #pragma omp parallel { /*вложенная параллельная область*/ … } } } Для выполнения вложенной параллельной области будет создана группа нитей, состоящая из:
- # Найдите ошибку в следующем фрагменте программы: int i, j; #pragma omp parallel default(shared) { #pragma omp for collapse (2) for (i=0; i<n; i++) { work_with_i (i); for (j=0; j < n; j++) work(i, j); } }
- # Найдите ошибку в следующем фрагменте программы: #include <math.h> double x=1024.0; int n=1024; #pragma omp parallel { #pragma omp atomic x=sqrt(x); #pragma omp atomic n&=0177; }
- # Найдите ошибку в следующем фрагменте программы: int x=0; omp_lock_t lcka, lckb; omp_init_lock (&lcka); omp_init_lock (&lckb); #pragma omp parallel { int iam=omp_get_thread_num(); if (iam ==0) { omp_set_lock (&lcka); omp_set_lock (&lckb); x = x + 1; omp_unset_lock (&lckb); omp_unset_lock (&lcka); } else { omp_set_lock (&lckb); omp_set_lock (&lcka); x = x + 2; omp_unset_lock (&lcka); omp_unset_lock (&lckb); } } } omp_destroy_lock (&lcka); omp_destroy_lock (&lckb);
- # Поиск ошибок в OpenMP-программе, выполняемый Intel Thread Checker, основан на: