Н., Пескова Е. Е., Шаманаев П. А. Основы параллельного программирования с использованием технологий mpi и openmp учебное пособие саранск издательство свмо 2013 2



Pdf көрінісі
бет52/53
Дата07.06.2023
өлшемі6.58 Mb.
#474796
1   ...   45   46   47   48   49   50   51   52   53
ParProg MPI OpenMP

atomic. Заметим, что flush не применяется на входе области 


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; 

 


76 


Достарыңызбен бөлісу:
1   ...   45   46   47   48   49   50   51   52   53




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет