Главная / Программирование /
Параллельное программирование с OpenMP / Тест 6
Параллельное программирование с OpenMP - тест 6
Упражнение 1:
Номер 1
Определите способ распределения витков цикла между нитями для следующего фрагмента программы:
#define N 100
void work(int i);
int main () {
#pragma omp parallel
{
#pragma omp for
for (int i=0;i<N;i++) work (i);
}
}
Ответ:
 (1) статический (static) 
 (2) зависит от значения переменной окружения OMP_SCHEDULE 
 (3) зависит от реализации компилятора 
Номер 2
Определите способ распределения витков цикла между нитями для следующего фрагмента программы:
#define N 100
#include "omp.h"
void work(int i);
int main () {
#pragma omp parallel
{
omp_set_schedule (omp_sched_dynamic);
#pragma omp for schedule(static)
for (int i=0;i<N;i++) work (i);
}
}
Ответ:
 (1) статический (static) 
 (2) динамический (dynamic) 
 (3) зависит от значения переменной окружения OMP_SCHEDULE. 
Номер 3
Определите способ распределения витков цикла между нитями для следующего фрагмента программы:
#define N 100
#include "omp.h"
void work(int i);
int main () {
#pragma omp parallel
{
omp_set_schedule (omp_sched_static);
#pragma omp for schedule(dynamic)
for (int i=0;i<N;i++) work (i);
}
}
Ответ:
 (1) статический (static) 
 (2) динамический (dynamic) 
 (3) зависит от значения переменной окружения OMP_SCHEDULE 
Упражнение 2:
Номер 1
Определите способ распределения витков цикла между нитями для следующего фрагмента программы:
#define N 100
#include "omp.h"
void work(int i);
int main () {
#pragma omp parallel
{
omp_set_schedule (omp_sched_static);
#pragma omp for
for (int i=0;i<N;i++) work (i);
}
}
Ответ:
 (1) статический (static) 
 (2) зависит от значения переменной окружения OMP_SCHEDULE 
 (3) зависит от реализации компилятора 
Номер 2
Определите способ распределения витков цикла между нитями для следующего фрагмента программы:
#define N 100
#include "omp.h"
void work(int i);
int main () {
#pragma omp parallel
{
omp_set_schedule (omp_sched_dynamic);
#pragma omp for
for (int i=0;i<N;i++) work (i);
}
}
Ответ:
 (1) динамический (dynamic) 
 (2) зависит от значения переменной окружения OMP_SCHEDULE 
 (3) зависит от реализации компилятора 
Номер 3
Определите способ распределения витков цикла между нитями для следующего фрагмента программы:
#define N 100
#include "omp.h"
void work(int i);
int main () {
#pragma omp parallel
{
omp_set_schedule (omp_sched_guided);
#pragma omp for
for (int i=0;i<N;i++) work (i);
}
}
Ответ:
 (1) управляемый(guided) 
 (2) зависит от реализации компилятора 
 (3) зависит от значения переменной окружения OMP_SCHEDULE 
Упражнение 3:
Номер 1
Определите количество нитей, между которыми будет распределена работа в параллельной области:
#define N 100
#include "omp.h"
void work(int i);
int main () {
omp_set_num_threads(2);
#pragma omp parallel num_threads(4)
{
#pragma omp for
for (int i=0;i<N;i++) work (i);
}
}
Ответ:
 (1) 2 
 (2) 4 
 (3) зависит от значения переменной окружения OMP_NUM _THREADS 
Номер 2
Определите количество нитей, между которыми будет распределена работа в параллельной области:
#include "omp.h"
void work(int i);
int main () {
int n;
n=10;
omp_set_num_threads(2);
#pragma omp parallel num_threads(4) if (n>20)
{
#pragma omp for
for (int i=0;i<n;i++) work (i);
}
}
Ответ:
 (1) 1 
 (2) 2 
 (3) 4 
Номер 3
Определите количество нитей, между которыми будет распределена работа в параллельной области:
#include "omp.h"
void work(int i);
int main () {
int n;
n=10;
#pragma omp parallel num_threads(4) if (n>20)
{
#pragma omp for
for (int i=0;i<n;i++) work (i);
}
}
Ответ:
 (1) зависит от значения переменных окружения OMP_THREAD_LIMIT и OMP_NUM_THREADS 
 (2) 1 
 (3) 4 
Упражнение 4:
Номер 1
Пусть следующая программа скомпилирована компилятором, поддерживающим вложенный параллелизм.
#include <stdio.h>
#include "omp.h"
int counter;
int main()
{
counter=0;
omp_set_nested(0);
#pragma omp parallel num_threads(2)
{
if (omp_get_thread_num() == 0) {
#pragma omp parallel num_threads(2)
{
#pragma omp atomic
counter++;
}
}
}
printf("Counter=%d\n",counter);
}
Определите значение переменной counter по завершении выполнения этой программы:
Ответ:
 (1) 1 
 (2) 2 
 (3) 4 
Номер 2
Пусть следующая программа скомпилирована компилятором, поддерживающим вложенный параллелизм.
#include <stdio.h>
#include "omp.h"
int counter;
int main()
{
counter=0;
omp_set_nested(1);
#pragma omp parallel num_threads(2)
{
if (omp_get_thread_num() == 0) {
#pragma omp parallel num_threads(2)
{
#pragma omp atomic
counter++;
}
}
}
printf("Counter=%d\n",counter);
}
Определите значение переменной counter по завершении выполнения этой программы:
Ответ:
 (1) 1 
 (2) 2 
 (3) 4 
Номер 3
Пусть следующая программа скомпилирована компилятором, поддерживающим вложенный параллелизм.
#include <stdio.h>
#include "omp.h"
int counter;
int main()
{
counter=0;
omp_set_nested(0);
#pragma omp parallel num_threads(2)
{
#pragma omp parallel num_threads(2)
{
#pragma omp atomic
counter++;
}
}
printf("Counter=%d\n",counter);
}
Определите значение переменной counter по завершении выполнения этой программы:
Ответ:
 (1) 1 
 (2) 2 
 (3) 4 
Упражнение 5:
Номер 1
Определите значение переменной team_size по завершении выполнения следующей программы:
#include <stdio.h>
#include "omp.h"
int main()
{
int team_size;
team_size=omp_get_team_size(omp_get_level ());
printf("Team Size=%d\n",team_size);
}
Ответ:
 (1) -1 
 (2) 0 
 (3) 1 
Номер 2
Определите значение переменной team_size по завершении выполнения следующей программы:
#include <stdio.h>
#include "omp.h"
int main()
{
int team_size;
team_size=0;
#pragma omp parallel num_threads(2)
{
if (omp_get_thread_num() == 0) {
team_size=omp_get_team_size(omp_get_level ());
}
}
printf("Team Size=%d\n",team_size);
}
Ответ:
 (1) 0 
 (2) 1 
 (3) 2 
Номер 3
Определите значение переменной team_size по завершении выполнения следующей программы:
#include <stdio.h>
#include "omp.h"
int main()
{
int team_size;
team_size=0;
#pragma omp parallel num_threads(2)
{
if (omp_get_thread_num() == 0) {
team_size=omp_get_team_size(0);
}
}
printf("Team Size=%d\n",team_size);
}
Ответ:
 (1) 0 
 (2) 1 
 (3) 2