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