Главная / Программирование /
Параллельное программирование с 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) в данном фрагменте программы ошибки нет