Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Распараллеливание программ. Учебник
.pdf
101
Доказательство
Доказательство

102

103
2. ОСНОВНЫЕ СРЕДСТВА ПАРАЛЛЕЛЬНОГО
ПРОГРАММИРОВАНИЯ
ИСПОЛЬЗОВАНИЕ OpenMP
π
static long num_steps = 100000;
double step;
void main ()
{ int i; double x, pi, sum = 0.0;
step = 1.0/(double) num_steps;
#pragma omp parallel for private(i,x) shared(sum) \
reduction(+:sum)
for (i=1;i<= num_steps; i++){
x = (i-0.5)*step;
sum += 4.0/(1.0+x*x);
}
pi = step * sum;
}

104
Основные понятия
Исходной программой
Директивой OpenMP
Программой OpenMP
Структурной областью
структурным блоком

105
Дополнительно каждая нить может иметь своё временное представление
памяти. Это временное представление не является необходимой частью модели памяти OpenMP, но учитывает наличие в современных вычислительных
системах регистров процессора, кэшей различных уровней и других структур,
позволяющих нити кэшировать переменные и избегать лишних обращений к
памяти.

106
#pragma omp
_OPENMP
ДИРЕКТИВЫ OpenMP API
#pragma omp parallel [clause[ [, ]clause] ...]
structured-block
#include <omp.h>

107
void subdomain(float *x, int istart, int ipoints)
{
int i;
for (i = 0; i < ipoints; i++)
x[istart+i] = 123.456;
}
void sub(float *x, int npoints)
{
int iam, nt, ipts, istart;
#pragma omp parallel default(shared) \
private(iam,nt,ipts,istart)
{
iam = omp_get_thread_num();
nt = omp_get_num_threads();
ipts = npoints / nt; /* size of partition */
istart = iam * ipts; /* starting array index */
if (iam == nt-1) /* last thread may do more */
ipts = npoints - istart;
subdomain(x, istart, ipts);
}
}
int main()
{
float array[10000];
sub(array, 10000);
return 0;
}
#pragma omp for [clause[[,] clause] ... ]
for-loop

108
#include <math.h>
void a8(int n, int m, float *a, float *b, float *y,
float *z)
{
int i;
#pragma omp parallel
{
#pragma omp for nowait
for (i=1; i<n; i++)
b[i] = (a[i] + a[i-1]) / 2.0;
#pragma omp for nowait
for (i=0; i<m; i++)
y[i] = sqrt(z[i]);
}
}
#pragma omp sections [clause[[,] clause] ...]
{
[#pragma omp section]
structured-block
[#pragma omp section
structured-block ]
...
}
#pragma omp single [clause[[,] clause] ...]
structured-block

109
SUBROUTINE A11_1(AA, BB, CC, DD, EE, FF, N)
INTEGER N
REAL AA(N,N), BB(N,N), CC(N,N), DD(N,N)
!$OMP PARALLEL
!$OMP WORKSHARE
AA = BB
CC = AA + DD
!$OMP END WORKSHARE
!$OMP END PARALLEL
END SUBROUTINE A11_1
#pragma omp master
structured-block
#pragma omp critical [(name)]
structured-block
#pragma omp barrier

110
#pragma omp atomic
expression-stmt
#pragma omp flush [(list)]
omp_test_lock, omp_set_nest_lock, omp_unset_nest_lock и
omp_test_nest_lock
omp_set_lock, omp_unset_lock,
#pragma omp ordered
structured-block
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
