- •Паралельнi цикли в OpenMp програмах
- •Синхронізація в OpenMp програмах
- •Директива omp single в OpenMp програмах
- •Директива omp master в OpenMp програмах
- •Директиви barrier та flush в OpenMp програмах
- •Паралельнi секцiї в OpenMp програмах
- •Методи задання кількості потоків в OpenMp програмах
- •Управлiння розподiлом iтерацiй циклу мiж потоками
- •Виконання паралельної областi за умовою та задання кількості потоків
- •Змiннi оточення та допомiжнi функцiї в OpenMp програмах
- •Управлiння розподiлом iтерацiй циклу OpenMp програмах. (8 питання)
- •Директива omp master в OpenMp програмах
- •Директива omp critical в OpenMp програмах
- •Директива ordered та nowait в OpenMp програмах(там де опції)
- •Написати приклад паралельного множення
- •Написати приклад використання критичних
- •Написати приклад використання синхронiзацiї
- •Написати приклад паралельного додавання
- •Написати приклад паралельного
Написати приклад паралельного множення
двох векторів зі статичним розподілом ітерацій
(який порядок виконання ?)
#include<omp.h>
#define N 10
double x[N],y[N],z[N];
int main()
{ int i; int num;
for (i=0;i<N;i++) x[i]=y[i]=i;
num = omp_get_num_threads();
#pragma omp parallel for schedule(dynamic,N/num){
for (i=0;i<N;i++)
z[i]=x[i]*y[i]; }
return 0; }
Написати приклад використання критичних
с
Виведе:
41
18467
6334
26500
19169
15724
11478
29358
26962
24464
max=
29358
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
#define SIZE 10
int main() {
int i; int max;
int a[SIZE];
for (i = 0; i < SIZE; i++)
{ a[i] = rand();
printf_s("%d\n", a[i]); }
max = a[0];
#pragma omp parallel for num_threads(4)
for (i = 1; i < SIZE; i++)
{ if (a[i] > max) { #pragma omp critical {
if (a[i] > max) max = a[i]; } } }
printf ("max = %d\n", max);}
Написати приклад використання синхронiзацiї
в OpenMP через механiзм замків
#include <s t d i o . h>
#include <omp. h>
omp_lock_t lock ;
i nt main( i nt argc , char _ argv [ ] )
{ int n ; omp_init_lock(&lock ) ;
#pragma omp p a r a l l e l pr i vat e (n)
{ n=omp_get_thread_num( ) ;
omp_set_lock(&lock ) ;
p r i n t f ( "Початок закр секцiї, потік %d\n" , n ) ;
s leep ( 5 ) ;
printf ( "Кiнець закр секцiї, потік ␣%d\n" , n ) ;
omp_unset_lock(&lock ) ; }
omp_destroy_lock(&lock ) ; }
Написати приклад використання директиви schedule з рiзними параметрами (що виведе програма?)
#include<omp.h>
#define N 10
double x[N],y[N],z[N];
int main() { int i; int num;
for (i=0;i<N;i++) x[i]=y[i]=i;
num = omp_get_num_threads();
#pragma omp parallel for schedule(dynamic,N/num){
for (i=0;i<N;i++) z[i]=x[i]*y[i]; } return 0; }
Написати приклад обчислення суми елементів
матриці з використанням директиви reduction
#pragma omp parallel{
#pragma for private(i) reduction(+:sum)
{ sum = 0 ; for ( i =0; i < N; i++)
{sum = a [ i ] ;}}}
Написати приклад використання директиви
s
Виведе:
read
input
compute
results
compute
results
write
output
#include <stdio.h>
#include <omp.h>
int main() {
#pragma omp parallel num_threads(2)
{ #pragma omp single
printf_s("read input\n");
printf_s("compute results\n");
#pragma omp single
printf_s("write output\n"); }}
Написати приклад обчислення добутку 3
скінчених сум з використанням директиви atomic
double sum1 = 0,sum2=0,sum3=0;
#pragma omp parallel private(sum1,sum2){
#pragma omp sections {
#pragma omp section{
for(i=1; i<=n; i++)
sum1 += i;
#pragma omp atomic
result+=sum1; }
#pragma omp section{
for(i=1; i<=m; i++)
sum2 += i;
#pragma omp atomic
result+=sum2;}
#pragma omp section{
for(i=1; i<=k; i++)
sum3 += i;
#pragma omp atomic
result+=sum3;}}}
printf("x = %fl", result);
return 0;
