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

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

Упражнение 1:
Номер 1
Найдите ошибку в следующем фрагменте программы:
#pragma omp parallel default(shared)
{
    int i, j;
    #pragma omp for
    for (i=0; i<n; i++) {
        #pragma omp for
        for (j=0; j<n; j++)
            work(i, j);
    }
}

Ответ:

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

 (2) в результате использования клаузы default(shared), счетчики циклов i и j являются общими для всех нитей  

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


Номер 2
Найдите ошибку в следующем фрагменте программы:
#pragma omp parallel default(shared)
{
    int i, j;
    #pragma omp for
       for (i=0; i<n; i++) {
       #pragma omp parallel
       {
           #pragma omp for shared (i,n)
           for (j=0; j<n; j++)
               work(i, j);
       }
    }
}

Ответ:

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

 (2) клауза shared не может быть использована в директиве for  

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


Номер 3
Найдите ошибку в следующем фрагменте программы:
#pragma omp parallel default(shared)
{
    int i, j;
    #pragma omp for
       for (i=0; i<n; i++) {
       #pragma omp parallel private (i,n)
       {
           #pragma omp for
           for (j=0; j<n; j++)
               work(i, j);
       }
    }
}

Ответ:

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

 (2) в результате использования клаузы private, значение переменных i и n во вложенном параллельном цикле не определено  

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


Упражнение 2:
Номер 1
Найдите ошибку в следующем фрагменте программы:
int i, j;
    #pragma omp parallel default(shared)
    {
         #pragma omp for collapse (3)
         for (i=0; i<n; i++) {
                for (j=0; j < n; j++)
                     work(i, j);
         }
     }

Ответ:

 (1) в результате использования клаузы default(shared), счетчики циклов - переменные i и j являются общими для всех нитей  

 (2) количество заголовков циклов не соответствуют значению, указанному в клаузе collapse  

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


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

Ответ:

 (1) в результате использования клаузы default(shared), счетчики циклов - переменные i и j являются общими для всех нитей  

 (2) между заголовками циклов указан вызов процедуры work_with_i (клауза collapsе может быть использована только распределения витков тесно-вложенных циклов)  

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


Номер 3
Найдите ошибку в следующем фрагменте программы:
int i, j;
    #pragma omp parallel default(shared)
    {
         #pragma omp for collapse (2)
         for (i=0; i<n; i++) {
                for (j=0; j < i; j++)
                     work(i, j);
         }
     }

Ответ:

 (1) в результате использования клаузы default(shared), счетчики циклов - переменные i и j являются общими для всех нитей  

 (2) граница вложенного цикла зависит от индексной переменной внешнего цикла (клауза collapsе может быть использована только распределения витков циклов с прямоугольным индексным пространством)  

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


Упражнение 3:
Номер 1
Найдите ошибку в следующем фрагменте программы:
#define N 10
float c[N];
float sum = 0.0;
#pragma omp parallel shared(sum, c)
{
    #pragma omp for reduction (+: sum) nowait
    for (int i=0; i<N; i++) {
         sum += c[i];
    }
    #pragma omp single
         printf (“Sum of array=%4.2f\n”, sum);
}

Ответ:

 (1) редукционная переменная sum объявлена общей(shared)  

 (2) в директиве for нельзя одновременно указать клаузу reduction и клаузу nowait  

 (3) до использования значения редукционной переменной sum в операторе печати в блоке single отсутствует барьерная синхронизация нитей  


Номер 2
Найдите ошибку в следующем фрагменте программы:
#define N 10
int i;
#pragma omp parallel
{
    #pragma omp for firstprivate(i) lastprivate(i)
    for (i=0; i<N; i++) {
         …
    }
    #pragma omp single
         printf (“Number of iteration=%d\n”, i);
}

Ответ:

 (1) одна и та же переменная не может быть указана в клаузах firstprivate и lastprivate одновременно  

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

 (3) индексная переменная цикла, витки которого распределяются между нитями при помощи директивы for, не может быть указана в клаузе lastprivate  


Номер 3
Найдите ошибку в следующем фрагменте программы:
#define N 10
int i;
#pragma omp parallel
{
    #pragma omp for private(i) lastprivate(i)
    for (i=0; i<N; i++) {
         …
    }
    #pragma omp single
         printf (“Number of iteration=%d\n”, i);
}

Ответ:

 (1) одна и та же переменная не может быть указана в клаузах private и lastprivate одновременно  

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

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


Упражнение 4:
Номер 1
Найдите ошибку в следующем фрагменте программы:
#pragma omp parallel default(shared)
{
    int i;
    #pragma omp for lastprivate(i)
    for (i=0; i!=n; i++) {
            work(i);
    }
}

Ответ:

 (1) в заголовке цикла, витки которого распределяются между нитями при помощи директивы for вместо оператора отношения (типа <,<=,>,>=) указан оператор сравнения (!=)  

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

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


Номер 2
Найдите ошибку в следующем фрагменте программы:
#pragma omp parallel default(shared)
{
    int i;
    #pragma omp for lastprivate(i)
    for (i=0; i<n; i++) {
            i+=2;
            work(i);
    }
}

Ответ:

 (1) индексная переменная цикла, витки которого распределяются между нитями при помощи директивы for, не может быть указана в клаузе lastprivate  

 (2) изменение значения индексной переменной цикла for внутри цикла (при помощи оператора i+=2) не допускается  

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


Номер 3
Найдите ошибку в следующем фрагменте программы:
#pragma omp parallel default(shared)
{
    int i;
    #pragma omp for lastprivate(i)
    for (i=0; i<n + omp_get_thread_num (); i++) {
            work(i);
    }
}

Ответ:

 (1) индексная переменная цикла, витки которого распределяются между нитями при помощи директивы for, не может быть указана в клаузе lastprivate  

 (2) значения выражений, указанных в заголовке цикла for, отличаются для каждой нити группы  

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


Упражнение 5:
Номер 1
Способ распределения витков цикла между нитями группы задается при помощи клаузы schedule(<алгоритм планирования>[,<число итераций>]).
Найдите ошибку в следующем фрагменте программы:
#pragma omp parallel default(shared)
{
    int i;
    #pragma omp for schedule(static, omp_get_thread_num())
    for (i=0; i<n; i++) {
            work(i);
    }
}

Ответ:

 (1) значение параметра <число итераций> клаузы schedule отличается для каждой нити группы  

 (2) при статическом планировании, задаваемом клаузой schedule(static), параметр <число итераций> задать нельзя  

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


Номер 2
Способ распределения витков цикла между нитями группы задается при помощи клаузы 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);
    }
}

Ответ:

 (1) при динамическом планировании, задаваемом клаузой schedule(dynamic), параметр <число итераций> задать нельзя  

 (2) значение параметра <число итераций> клаузы schedule отличается для каждой нити группы  

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


Номер 3
Найдите ошибку в следующем фрагменте программы:
#pragma omp parallel default(shared)
{
    int i;
    #pragma omp for schedule(dynamic)
    for (i=0; i<n; i++) {
        #pragma omp ordered
            printf("iteration %d\n", i); 
    }
}

Ответ:

 (1) использование клаузы schedule(dynamic) для цикла for, в котором используется директива ordered запрещено  

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

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




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