Практична частина Приклад програми 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.
Отже, один з найпростіших способів застосувати паралелізм у додатку з інтенсивними математичними розрахунками – використовувати багатопотокову оптимізовану бібліотеку. Це не тільки допоможе заощадити час розробки, але також і суттєво зменшить обсяг тестування.
