74
распределения работ, а также на входе и выходе области действия
директивы
master [12,14].
3.6 Примеры программ с использованием технологии OpenMP
Первая программа реализует
операцию перемножения двух
квадратных
матриц.
В
последовательной
области
происходит
инициализация массивов и замер времени. Затем порождается
параллельная область, исходные и результирующий
массивы являются
общими переменными, а параметры циклов частными.
После выхода из
параллельной секции снова происходит замер времени, вывод результата
и общего времени выполнения программы на экран [3,5].
Программа. Параллельное перемножение двух квадратных матриц
#include
#include
#define N 1000
int main()
{
double A[N][N], B[N][N] ,C[N][N];
int i ,j, k;
double start, end;
for (i=0; i<; ,i++)
for (j=0; j
{
A[i][j]=i+j;
B[i][j]=i*j;
}
start=omp_get_wtime();
#pragma omp parallel for shared(A,B,C) private(i, j, k)
for (i=0; i<; ,i++){
for (j=0; j
C[i][j]=0;
for (k=0; k
C[i][j]+=A[i][k]*B[k][j];
}
}
end=omp_get_wtime();
for (i=0; i<; ,i++)
for (j=0; j
printf (“C[%d][%d]=%lf\n” , i, j, C[i][j]);
75
printf (“Time %lf\n” , end-start);
return 0;
}
В следующем примере вычисляется
определенный интеграл от
функции sin(x) методом трапеций. В параллельной области вычисляется
значение функции для каждого интервала разбиения и разграничивается
доступ к операции сложения директивой atomic [9].
Программа. Параллельное вычисление интеграла методом трапеций
#include
#include
#include
double a,b,h;
double f(int j)
{
return sin(a+j*h);
}
int main()
{
double sum,result;
int i,N;
sum=0;
result=0;
printf("Vvedite a,b,N\n");
scanf("%lf %lf %d", a ,b ,N);
h=(b-a)/N;
#pragma omp parallel for private (i) shared (N)
for (i=1;i
{
#pragma omp atomic
sum+=f(i);
}
result=h*((f(0)+f(N))/2+sum);
printf("Znachenie %0.5lf",result);
system("PAUSE");
return 0;
}