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

Практична частина Приклад програми mkl

Вирішити одновимірне рівняння теплопровідності методом кінцевих різниць.

Самостійно розібрати процедури:

Приклад

Варіант програми №1

program teplo_1D

use lapack95

use f95_precision

integer, parameter :: N = 64

integer k

real DL(N-1), D(N), DU(N-1) ! DL - нижняя, D - основная, DU - верхняя

real AB(4,N)

real :: UN(N) = 0

real :: dt = 0.01 ! --- шаг по времени

real, parameter :: H = 1.0 ! --- длина области

real :: dh = H/(N-1) ! шаг по области

integer IPIV(N), INFO

!==========================================================

open(1,file = "res1.txt")

open(3,file = "res2.txt")

open(5,file = "res3.txt")

!------ заполняем диагонали

!------ так как на границах Г.У. первого рода

DL = -dt/dh**2; DL(N-1) = 0 ! --- нижняя

D = 2*dt/dh**2+1; D(1) = 1; D(N) = 1 ! --- основная

DU = -dt/dh**2; DU(1) = 0 ! --- верхняя

Варіант програми №2

!----- формируем AB-матрицу

AB(1,:) = 0 ! не заполняем, нужна для процедур

AB(2,2:N) = DU

AB(3,1:N) = D

AB(4,1:N-1) = DL

call gbtrf(AB, ipiv = IPIV) ! ---- делаем факторизацию

do k = 1,500

UN(N) = 5*k*dt ! ----- правая часть

call gbtrs(AB, UN, IPIV, info = INFO) ! --- вызываем решатель

if ((k == 100).OR.(k == 300).OR.(k == 500)) then

do i = 1,N

x = (i-1)*dh

write(k/100,*) x, UN(i)

end do

close(k/100)

end if

end do

close(1)

close(3)

close(5)

end

Приклад програми blas

Приклад програми множення двох матриць з використанням BLAS:

#include<stdio.h>

#include<cblas.h> // заголовочный файл C-интерфейса библиотеки BLAS

#define M 300

#define N 400

#define K 500

int main()

{ int i,j;

float A[M*K], // массив расположен в памяти одним непрерывным блоком

B[K][N], // этот тоже

*C; // и этот тоже будет непрерывным

C=(float*)malloc(M*N*sizeof(float)); // ну вот, непрерывный ;)

for (i=0;i<M;i++) // инициализируем массив A

for (j=0;j<K;j++)

A[i*K+j]=3*j+2*i;

for (i=0;i<K;i++) // инициализируем массив B

for (j=0;j<N;j++)

B[i][j]=5*i+j;

for (i=0;i<M*N;i++) C[i]=5; // инициализируем массив C (зачем?)

// перемножаем!!!

// нам нужно C=AB, поэтому сделаем beta=0

cblas_sgemm(CblasRowMajor,CblasNoTrans,CblasNoTrans,

M,N,K,1.0,A,K,&B[0][0],N,0.0,C,N);

for (i=0;i<M;i++) // выводим результат на экран (наверно не влезет: 300*400)

{ for (j=0;j<N;j++) printf("%.2f ",C[i*N+j]);

printf("\n");

}

free(C);

return 0;

}

Приклад програми essl

У прикладі програми наступні дев'ять рядків коду на мові FORTRAN:

do l=1,control

do j=1,control

xmult=0.d0

do k=1,control

xmult=xmult+a(i,k)*a(k,j)

end do

b(i,j)=xmult

end do

end do

Висновки

У цій роботі розглядалося і було доведено, що використання програмних бібліотек – це простий спосіб досягти негайного збільшення продуктивності багатоядерних, багатопроцесорних і кластерних комп'ютерних системах. Бібліотека Intel® Math Kernel Library (Intel® MKL) містить великий набір функцій, який буде корисний у додатках з великою кількістю математичних операцій. Наведений матеріал застосовний до систем на процесорах IA-32 і Intel® 64 з операційними системами Windows, Linux*, і Mac OS* X.

Отже, один з найпростіших способів застосувати паралелізм у додатку з інтенсивними математичними розрахунками – використовувати багатопотокову оптимізовану бібліотеку. Це не тільки допоможе заощадити час розробки, але також і суттєво зменшить обсяг тестування.

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