
6. Література
Openmp: Simple, portable, scalable smp programming. http://www.openmp.org/drupal/.
Антонов А.С. Параллельное программирование с использованием технологи OpenMP: Учебное пособие. – М.: Изд-во МГУ, 2009. – 77 с.
Левин М. П. Параллельное программирование с использованием OpenMP: учебное пособие / М. П. Левин. – М: Интернет-Университет Информационных Технологий; БИНОМ. Лаборатория знаний, 2008. – 118 с.
Немнюгин С. А., Стесик О. Л. Параллельное программирование для многопроцессорных вычислительных систем. — СПб.: БХВ–Петербург, 2002. — 400 с.
Эндрюс Г. Р. Основы многопоточного, параллельного и распределенного программирования.: Пер. с англ. — М.: Издательский дом “Вильямс”, 2003. — 512 с.
7. Додатки
Лістинг програми matrs.c
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <time.h>
#include <string.h>
#include <sys/types.h>
#include <sys/times.h>
#include <limits.h>
#define Size 4
int i, j, k, r;
long int it=100000000;
double a[Size][Size]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
double b[Size][Size]={1,2,3,4,5,6,7,8,8,7,6,5,4,3,2,1};
double c[Size][Size]={};
double e1;
time_t first, second;
struct tms startfi, endfi;
int ticks;
/*------------------------------------------------------------*/
int main(int argc, char **argv)
{
first=time(NULL); times(&startfi); ticks = CLOCKS_PER_SEC;
for(i=0;i<Size;i++)
{
for(j=0;j<Size;j++)
{
c[i][j]=0;
for(r=0;r<it;r++) for(k=0;k<Size;k++) c[i][j]=c[i][j] + a[i][k] * b[k][j];
}
}
for(i=0;i<Size;i++) for(j=0;j<Size;j++) c[i][j]=c[i][j]/it;
second=time(NULL); times(&endfi);
e1 = endfi.tms_utime - startfi.tms_utime;
printf("Input matrix A:\n");
for(i=0;i<Size;i++) {for(j=0;j<Size;j++) printf("|%6.2f\t", a[i][j]); printf("\n");}
printf("Input matrix B:\n");
for(i=0;i<Size;i++) {for(j=0;j<Size;j++) printf("|%6.2f\t", b[i][j]); printf("\n");}
printf("Resulting matrix C:\n");
for(i=0;i<Size;i++) {for(j=0;j<Size;j++) printf("|%6.2f\t", c[i][j]); printf("\n");}
printf("Computational time (by time) is: %8.5f minutes (%8.5f seconds)\n", difftime(second,first)/60, difftime(second, first));
printf("Computational time (by times) is: %8.5f seconds \n", e1/ticks*10000);
return 0;
}
Лістинг програми matromp.c
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <time.h>
#include <string.h>
#include <sys/types.h>
#include <sys/times.h>
#include <limits.h>
#include <omp.h>
#define Size 4
int np=4;
int i, j, k, r;
long int it=100000000;
double a[Size][Size]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
double b[Size][Size]={1,2,3,4,5,6,7,8,8,7,6,5,4,3,2,1};
double c[Size][Size]={};
double e1, e2;
time_t first, second;
struct tms startfi, endfi;
int ticks;
double stowt, endowt;
/*------------------------------------------------------------*/
int main(int argc, char **argv)
{
omp_set_dynamic(0);
omp_set_num_threads(np);
first=time(NULL); times(&startfi); ticks = CLOCKS_PER_SEC; stowt = omp_get_wtime();
#pragma omp parallel shared(c) private(i,j,k,r)
{
#pragma omp for
for(i=0;i<Size;i++)
{
for(j=0;j<Size;j++)
{
c[i][j]=0;
for(r=0;r<it;r++) for(k=0;k<Size;k++) c[i][j]=c[i][j] + a[i][k] * b[k][j];
printf("Element c[%d][%d] was calculated by thread #%d \n" , i, j, omp_get_thread_num());
}
}
}
for(i=0;i<Size;i++) for(j=0;j<Size;j++) c[i][j]=c[i][j]/it;
second=time(NULL); times(&endfi); endowt = omp_get_wtime();
e1 = endfi.tms_utime - startfi.tms_utime;
e2 = endowt - stowt;
printf("Input matrix A:\n");
for(i=0;i<Size;i++) {for(j=0;j<Size;j++) printf("|%6.2f\t", a[i][j]); printf("\n");}
printf("Input matrix B:\n");
for(i=0;i<Size;i++) {for(j=0;j<Size;j++) printf("|%6.2f\t", b[i][j]); printf("\n");}
printf("Resulting matrix C:\n");
for(i=0;i<Size;i++) {for(j=0;j<Size;j++) printf("|%6.2f\t", c[i][j]); printf("\n");}
printf("Computational time (by time) is: %8.5f minutes (%8.5f seconds)\n", difftime(second,first)/60, difftime(second, first));
printf("Computational time (by times) is: %8.5f seconds \n", e1/ticks*10000);
printf("Computational time (by omp_get_wtime) on %d processor(s) is: %8.5f seconds \n", np, e2);
return 0;
}
Розшифровка
Що таке прагма омр
Типи
Яка різниця між шеред і глобал