игра брюс 2048
Главная / Программирование / Параллельное программирование с OpenMP / Тест 7

Параллельное программирование с OpenMP - тест 7

Упражнение 1:
Номер 1
Найдите ошибку в следующем фрагменте программы:
#define N 1000
int main (void){
     float a[N], tmp;
     #pragma omp parallel
     {
           #pragma omp for
           for(int i=0; i<N;i++) {
                   tmp= a[i]*a[i];
                   a[i]=1-tmp; 
           }
     }
}

Ответ:

 (1) в директиве for отсутствует клауза private(i) 

 (2) в директиве for отсутствует клауза private(tmp) 

 (3) в данном фрагменте программы ошибки нет 


Номер 2
Найдите ошибку в следующем фрагменте программы:
#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; 
           }
     }
}

Ответ:

 (1) в директиве for отсутствует клауза private(i) 

 (2) в директиве for отсутствует клауза private(tmp) 

 (3) в данном фрагменте программы ошибки нет 


Номер 3
	
Найдите ошибку в следующем фрагменте программы:
#define N 1000
int main (void){
     float a[N], tmp;
     #pragma omp parallel
     {
            int i;
           #pragma omp for private(i)
           for(i=0; i<N;i++) {
                   tmp= a[i]*a[i];
                   a[i]=1-tmp; 
           }
     }
}

Ответ:

 (1) в директиве parallel отсутствует клауза shared(a) 

 (2) в директиве for отсутствует клауза private(tmp) 

 (3) в данном фрагменте программы ошибки нет 


Упражнение 2:
Номер 1
Найдите ошибку в следующем фрагменте программы:
int main (void){
     int a, i;
     #pragma omp parallel shared(a) private(i)
     {
          #pragma omp master
               a = 0;
          #pragma omp for reduction(+:a)
          for (i = 0; i < 10; i++) {
               a += i;
          }
     }
}

Ответ:

 (1) в директиве parallel клауза shared(a) должна быть заменена на private(a) 

 (2) перед директивой for отсутствует директива barrier 

 (3) в данном фрагменте программы ошибки нет 


Номер 2
int main (void){
     int a, i;
     #pragma omp parallel shared(a) private(i)
     {
          #pragma omp single
               a = 0;
          #pragma omp for
          for (i = 0; i < 10; i++) {
               a += i;
          }
     }
}

Ответ:

 (1) перед директивой for отсутствует директива barrier 

 (2) в директиве for отсутствует клауза reduction(+:a) 

 (3) в данном фрагменте программы ошибки нет 


Номер 3
Найдите ошибку в следующем фрагменте программы:
int main (void){
     int a;
     #pragma omp parallel private(a)
     {
          #pragma omp single
               a = 0;
          #pragma omp for reduction(+:a)
          for (int i = 0; i < 10; i++) {
               a += i;
          }
     }
}

Ответ:

 (1) перед директивой for отсутствует директива barrier 

 (2) в директиве parallel клауза private (a) должна быть заменена на shared(a) 

 (3) в данном фрагменте программы ошибки нет 


Упражнение 3:
Номер 1
Найдите ошибку в следующем фрагменте программы:
#include <omp.h>
int numproc;
#pragma omp threadprivate(numproc)
int main (void){
     numproc=omp_get_num_procs();
     #pragma omp parallel
     {
          if (numproc < 4) 
               do_small_work();
          else 
               do_big_work ();
     }
}

Ответ:

 (1) функция omp_get_num_procs не может быть вызвана вне параллельной области 

 (2) в директиве parallel отсутствует клауза copyin(numproc) 

 (3) в данном фрагменте программы ошибки нет 


Номер 2
Найдите ошибку в следующем фрагменте программы:
#include <omp.h>
int main (void){
     #pragma omp parallel
     {
          int numt;
          #pragma omp single
               numt=omp_get_num_threads();
          if (numt < 4) 
               do_small_work();
          else 
               do_big_work ();
     }
}

Ответ:

 (1) после конструкции single отсутствует директива barrier 

 (2) в директиве single отсутствует клауза copyprivate(numt) 

 (3) в данном фрагменте программы ошибки нет 


Номер 3
Найдите ошибку в следующем фрагменте программы:
#define N 1000
float a[N], b[N];
int main (void){
     int i;
     #pragma omp parallel
     {
          #pragma omp for
          for (i=0; i<N-1; i++) {
               a[i] = b[i] + b[i+1];
          }
          a[i]=b[i];
     }
}

Ответ:

 (1) в директиве parallel отсутствует клауза shared(a,b) 

 (2) в директиве parallel отсутствует клауза private(i) 

 (3) в директиве for отсутствует клауза lastpivate(i) 


Упражнение 4:
Номер 1
Найдите ошибку в следующем фрагменте программы:
#pragma omp parallel
{
       int me;
       me = omp_get_thread_num ();
       if (me == 0) goto Master;
       #pragma omp barrier
Master:
       #pragma omp single
}

Ответ:

 (1) в директиве parallel отсутствует клауза private(me) 

 (2) дедлок - взаимная блокировка нитей, возникающая в результате того что master-нить не попадает на директиву barrier 

 (3) оператор goto не может быть использован внутри конструкции parallel  


Номер 2
Найдите ошибку в следующем фрагменте программы:
#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];
}

Ответ:

 (1) критические секции не могут быть вложены друг в друга 

 (2) дедлок - взаимная блокировка нитей, возникающая в результате того что одноименные критические секции вложены друг в друга 

 (3) в данном фрагменте программы ошибки нет 


Номер 3
#define N 10
int A[N],B[N], sum;
#pragma omp parallel default(shared) num_threads(10)
{
      int iam=omp_get_thread_num();
      if (iam ==0) {
         #pragma omp critical (update_a)
             #pragma omp critical (update_b)
                  sum +=A[iam];
      } else {
         #pragma omp critical (update_b)
              #pragma omp critical (update_a)
                  sum +=B[iam];
      }
}

Ответ:

 (1) критические секции, определяемые директивой critical, не могут быть вложены друг в друга 

 (2) дедлок - взаимная блокировка нитей, возникающая при входе master-нитью в критическую секцию с именем update_a и любой другой нитью в секцию с именем update_b (в этом случае вложенные критические секции не смогут быть обработаны) 

 (3) в данном фрагменте программы ошибки нет 


Упражнение 5:
Номер 1
Поиск ошибок в OpenMP-программе, выполняемый Intel Thread Checker, основан на:

Ответ:

 (1) методе статического анализа кода программы 

 (2) методе динамического анализа корректности программы 

 (3) методе сравнительной отладки нескольких запусков одной программы 


Номер 2
Поиск ошибок в OpenMP-программе, выполняемый Sun Thread Analyzer, основан на:

Ответ:

 (1) методе динамического анализа корректности программы 

 (2) методе статического анализа кода программы 

 (3) методе сравнительной отладки нескольких запусков одной программы 


Номер 3
Intel Thread Checker:

Ответ:

 (1) обнаруживает все возможные ошибки типа datarace и deadlock в программе 

 (2) ошибки, которые проявились при выполнении программы на заданном наборе входных тестовых данных 




Главная / Программирование / Параллельное программирование с OpenMP / Тест 7