Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab5.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
354.3 Кб
Скачать

6. Література

  1. Openmp: Simple, portable, scalable smp programming. http://www.openmp.org/drupal/.

  2. Антонов А.С. Параллельное программирование с использованием технологи OpenMP: Учебное пособие. – М.: Изд-во МГУ, 2009. – 77 с.

  3. Левин М. П. Параллельное программирование с использованием OpenMP: учебное пособие / М. П. Левин. – М: Интернет-Университет Информационных Технологий; БИНОМ. Лаборатория знаний, 2008. – 118 с.

  4. Немнюгин С. А., Стесик О. Л. Параллельное программирование для многопроцессорных вычислительных систем. — СПб.: БХВ–Петербург, 2002. — 400 с.

  5. Эндрюс Г. Р. Основы многопоточного, параллельного и распределенного программирования.: Пер. с англ. — М.: Издательский дом “Вильямс”, 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;

}

Розшифровка

Що таке прагма омр

Типи

Яка різниця між шеред і глобал

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]