Расчетное задание / КМ4 / Отчет КМ4 Долгов Р ТФ-12-20
.pdf
Компиляция – 0 ошибок, 0 предупреждений.
Для наглядности сравним результаты из программы и примера в IMSL.
IMSL:
11
Fortran:
Результаты совпадают.
Подпрограмма №3: Compute determinant after factoring (Вычислить определитель после разложения на множители).
Задача: Вычислить определитель комплексной Эрмитовой матрицы с учетом разложения вида U·DUH.
Для этого используем: CALL LFDHF (N, FAC, LDFAC, IPVT, DET1, DET2)
12
Входные параметры подпрограммы:
1.N — Число уравнений.
2.FAC — Комплексная матрица размерностью NxN, содержащая разложение матрицы коэффициентов A в качестве выходных данных процедуры LFCHF/DLFCHF или LFTHF/DLFTHTHF. Используется только верхний треугольник FAC.
3.LDFAC — ведущее измерение FAC в точности так, как указано в инструкции измерения вызывающей программы.
4.IPVT — вектор длины N, содержащий сводную информацию для факторизации A в качестве выходных данных из процедуры
LFCHF/DLFCHF или LFTHF/DLFTHTHF.
Выходные параметры подпрограммы:
1.DET1 — скалярный параметр, содержащий мантиссу определителя. Значение, установленное в 1, нормализуется таким образом, что 1.0 = |DET1| < 10.0 или DET 1 = 0.0.
2.DET2 — скалярный параметр, содержащий показатель степени определителя. Определитель возвращается в виде det(A) = DET1∙10DET2.
Алгоритм.
Процедура LFDHF вычисляет определитель комплексной Эрмитовой
матрицы неопределенных коэффициентов. Чтобы вычислить определитель, матрица коэффициентов должна сначала подвергнуться разложению вида U·DUH. Это можно сделать, вызвав либо LFCHF, либо LFТHF. Поскольку det U =
± 1, для вычисления определителя используется формула det(A) = det(U) det(D) det UH = det(D). Det(D) вычисляется как произведение определителей его блоков.
Пример решения.
Перенесем пример из библиотеки IMSL в систему программирования Fortran и сравним результаты описанные в IMSL и полученные в программе.
13
Компиляция – 0 ошибок, 0 предупреждений.
14
Линкинг – 0 ошибок, о предупреждений.
Для наглядности сравним результаты из программы и примера в IMSL.
IMSL:
15
Fortran:
Результаты совпадают.
Объединение процедур.
Листинг программы с одинарной точностью.
program odinarnaya_tochonst implicit none
! Объявление переменных
INTEGER LDA, N, I, j, k, z, v PARAMETER (LDA=3, N=3) INTEGER IPVT(N), NOUT
REAL RCOND, DET1, DET2, START, FINISH
COMPLEX A(LDA,LDA), B(N,3), X(N,3), FAC(LDA,LDA), C(N), D(N), RES(N), M1(3,12000000), M2(3,12000000), M3(12000000)
CALL CPU_TIME (START)
DATA A/(3.0,0.0), (1.0,1.0), (4.0,0.0), (1.0,-1.0), (2.0,0.0), (-5.0,-1.0), (4.0,0.0), (- 5.0,1.0), (-2.0,0.0)/
DATA B/(7.0,32.0), (-39.0,-21.0), (51.0,9.0), (-6.0,11.0), (-5.5,-22.5), (16.0,17.0), (- 2.0,-17.0), (4.0,10.0), (-2.0,12.0)/
DATA C/(7.0,32.0), (-39.0,-21.0), (51.0,9.0)/ DO j=1,12000000-2,3
DO k=0,2 M1(1,j+k)=A(1,1+k) M1(2,j+k)=A(2,1+k) M1(3,j+k)=A(3,1+k) A(1,1+k)=A(1,1+k)+(0.001/j) A(2,1+k)=A(2,1+k)+(0.001/j)
16
A(3,1+k)=A(3,1+k)+(0.001/j)
M2(1,j+k)=B(1,1+k)
M2(2,j+k)=B(2,1+k)
M2(3,j+k)=B(3,1+k)
B(1,1+k)=B(1,1+k)+(0.001/j)
B(2,1+k)=B(2,1+k)+(0.001/j)
B(3,1+k)=B(3,1+k)+(0.001/j)
M3(j+k)=C(1+k)
C(1+k)=C(1+k)+(0.001/j) end do
end do
DO z=1,12000000-2,3 ! Программа 1
CALL LFTHF (N, A, LDA, FAC, LDA, IPVT) DO 10 I=1, 3
CALL LFSHF (N, FAC, LDA, IPVT, B(1,I), X(1,I)) 10 CONTINUE
CALL WRCRN ('X', N, 3, X, N, 0) ! Программа 2
CALL UMACH (2, NOUT)
CALL LFCHF (N, A, LDA, FAC, LDA, IPVT, RCOND) WRITE (NOUT,99998) RCOND, 1.0E0/RCOND
DO 20 I=1, 3
CALL LFIHF (N, A, LDA, FAC, LDA, IPVT, C, D, RES) WRITE (NOUT,99999) I
CALL WRCRN ('D', 1, N, D, 1, 0) CALL WRCRN ('RES', 1, N, RES, 1, 0) C(2) = C(2) + (0.2E0, 0.2E0)
20 CONTINUE
99998 FORMAT (' RCOND = ',F5.3,/,' L1 Condition number = ',F6.3) 99999 FORMAT (//,' For problem ', I1)
! Программа 3
CALL LFTHF (N, A, LDA, FAC, LDA, IPVT) CALL LFDHF (N, FAC, LDA, IPVT, DET1, DET2) CALL UMACH (2, NOUT)
DO k=0,2 A(1,1+k)=M1(1,z+k) A(2,1+k)=M1(2,z+k) A(3,1+k)=M1(3,z+k) B(1,1+k)=M2(1,z+k) B(2,1+k)=M2(2,z+k) B(3,1+k)=M2(3,z+k) C(1+k)=M3(z+k) END DO
END DO
17
WRITE (NOUT,99997) DET1, DET2
99997 FORMAT (' The determinant is', F5.1, ' * 10**', F2.0) CALL CPU_TIME (FINISH)
PRINT *, 'TIME = ', FINISH-START, ' SEC' end program odinarnaya_tochonst
Листинг программы с двойной точностью.
program dvoinaya_tochnost implicit none
!Объявление переменных
INTEGER LDA, N, I, j, k, z, v PARAMETER (LDA=3, N=3) INTEGER IPVT(N), NOUT
REAL(8) RCOND, DET1, DET2, START, FINISH
COMPLEX(8) A(LDA,LDA), B(N,3), X(N,3), FAC(LDA,LDA), C(N), D(N), RES(N), M1(3,12000000), M2(3,12000000), M3(12000000)
CALL CPU_TIME (START)
DATA A/(3.0,0.0), (1.0,1.0), (4.0,0.0), (1.0,-1.0), (2.0,0.0), (-5.0,-1.0), (4.0,0.0), (- 5.0,1.0), (-2.0,0.0)/
DATA B/(7.0,32.0), (-39.0,-21.0), (51.0,9.0), (-6.0,11.0), (-5.5,-22.5), (16.0,17.0), (- 2.0,-17.0), (4.0,10.0), (-2.0,12.0)/
DATA C/(7.0,32.0), (-39.0,-21.0), (51.0,9.0)/ DO j=1,12000000-2,3
DO k=0,2 M1(1,j+k)=A(1,1+k) M1(2,j+k)=A(2,1+k) M1(3,j+k)=A(3,1+k) A(1,1+k)=A(1,1+k)+(0.001/j) A(2,1+k)=A(2,1+k)+(0.001/j) A(3,1+k)=A(3,1+k)+(0.001/j) M2(1,j+k)=B(1,1+k) M2(2,j+k)=B(2,1+k) M2(3,j+k)=B(3,1+k) B(1,1+k)=B(1,1+k)+(0.001/j) B(2,1+k)=B(2,1+k)+(0.001/j) B(3,1+k)=B(3,1+k)+(0.001/j) M3(j+k)=C(1+k) C(1+k)=C(1+k)+(0.001/j) end do
end do
DO z=1,12000000-2,3
!Программа 1
CALL DLFTHF (N, A, LDA, FAC, LDA, IPVT)
DO 10 I=1, 3
18
CALL DLFSHF (N, FAC, LDA, IPVT, B(1,I), X(1,I)) 10 CONTINUE
CALL WRCRN ('X', N, 3, X, N, 0) ! Программа 2
CALL UMACH (2, NOUT)
CALL DLFCHF (N, A, LDA, FAC, LDA, IPVT, RCOND) WRITE (NOUT,99998) RCOND, 1.0E0/RCOND
DO 20 I=1, 3
CALL DLFIHF (N, A, LDA, FAC, LDA, IPVT, C, D, RES) WRITE (NOUT,99999) I
CALL WRCRN ('D', 1, N, D, 1, 0) CALL WRCRN ('RES', 1, N, RES, 1, 0) C(2) = C(2) + (0.2E0, 0.2E0)
20 CONTINUE
99998 FORMAT (' RCOND = ',F5.3,/,' L1 Condition number = ',F6.3) 99999 FORMAT (//,' For problem ', I1)
! Программа 3
CALL DLFTHF (N, A, LDA, FAC, LDA, IPVT) CALL DLFDHF (N, FAC, LDA, IPVT, DET1, DET2) CALL UMACH (2, NOUT)
DO k=0,2 A(1,1+k)=M1(1,z+k) A(2,1+k)=M1(2,z+k) A(3,1+k)=M1(3,z+k) B(1,1+k)=M2(1,z+k) B(2,1+k)=M2(2,z+k) B(3,1+k)=M2(3,z+k) C(1+k)=M3(z+k) END DO
END DO
WRITE (NOUT,99997) DET1, DET2
99997 FORMAT (' The determinant is', F5.1, ' * 10**', F2.0) CALL CPU_TIME (FINISH)
PRINT *, 'TIME = ', FINISH-START, ' SEC' end program dvoinaya_tochnost
Расчет памяти.
В программе используется матрица А размерностью 3х3, матрица В размерностью 3х3, а также вектор-столбец С 3х1. В постановке задачи исследования производительности ПК необходимо выполнение программы минимум 40 секунд времени, с учётом ограничения на используемую RAMпамять компьютера (минимум 300-400 Мб), поэтому для увеличения
19
используемой процессом памяти было необходимо создать буферную матрицу. При 300 Мб выполняется минимум по времени. Посчитаем необходимое количество элементов:
(300 ∙ 1024 ∙ 1024) / (4 ∙ 3 ∙ 2 + 1) = 11234736 элементов.
Примем значение 12000000. Тогда объем памяти для одинарной точности будет составлять 320,43 Мб. Соответсвтенно для двойной точности объем памяти составит 640,86 Мб.
4 Байта предоставляется 1 элементу вещественного типа REAL. Так как будет использоваться 2 буферные матрицы – делим на 2. Таким образом, 2 буферные матрицы будет иметь размерность (3, 12000000), а буферный вектор столбец (12000000).
Основные параметры тестируемой системы.
∙CPU – Intel(R) Core(TM) i7-12800 1.80 GHz 3.70 GHz; 14 ядер, 20 потоков
∙RAM – 16.00 Гб Kingston 9905600-119.A00G DDR4 SO-DIMM 8 Gb, Kingston 9905600-119.A00G DDR4 SO-DIMM 8 Gb
∙SSD – NVMe Kingston RBUSNS8 1 Тб
∙Windows 11 Домашняя для одного языка, 64-разрядная
Результаты измерений.
Таблица 1 – результаты 90 расчетов в режиме debug с одинарной точностью
Т1 = |
Т2 = |
Т3 = |
Т4 = |
Т5 = |
Т6 = |
Т7 = |
Т8 = |
Т9 = |
Т10 = |
22.92 |
17.09 |
16.93 |
10.98 |
18.56 |
20.42 |
13.76 |
21.00 |
27.79 |
21.67 |
Т11 = |
Т12 = |
Т13 = |
Т14 = |
Т15 = |
Т16 = |
Т17 = |
Т18 = |
Т19 = |
Т20 = |
23.56 |
17.00 |
23.23 |
27.26 |
41.85 |
18.45 |
9.734 |
8.031 |
12.85 |
17.94 |
Т21 = |
Т22 = |
Т23 = |
Т24 = |
Т25 = |
Т26 = |
Т27 = |
Т28 = |
Т29 = |
Т30 = |
14.96 |
9.265 |
18.91 |
14.78 |
14.07 |
18.92 |
17.14 |
16.96 |
19.55 |
25.28 |
Т31 = |
Т32 = |
Т33 = |
Т34 = |
Т35 = |
Т36 = |
Т37 = |
Т38 = |
Т39 = |
Т40 = |
27.58 |
21.50 |
21.50 |
21.94 |
21.70 |
16.00 |
23.31 |
20.59 |
20.21 |
22.71 |
Т41 = |
Т42 = |
Т43 = |
Т44 = |
Т45 = |
Т46 = |
Т47 = |
Т48 = |
Т49 = |
Т50 = |
17.21 |
25.10 |
27.70 |
22.70 |
21.98 |
21.85 |
26.62 |
18.73 |
20.50 |
28.92 |
Т51 = |
Т52 = |
Т53 = |
Т54 = |
Т55 = |
Т56 = |
Т57 = |
Т58 = |
Т59 = |
Т60 = |
29.76 |
20.01 |
31.85 |
24.59 |
30.53 |
33.31 |
25.51 |
34.10 |
23.57 |
29.32 |
Т61 = |
Т62 = |
Т63 = |
Т64 = |
Т65 = |
Т66 = |
Т67 = |
Т68 = |
Т69 = |
Т70 = |
46.40 |
52.34 |
25.12 |
15.09 |
22.28 |
22.31 |
16.57 |
27.84 |
10.87 |
5.984 |
Т71 = |
Т72 = |
Т73 = |
Т74 = |
Т75 = |
Т76 = |
Т77 = |
Т78 = |
Т79 = |
Т80 = |
16.34 |
11.40 |
16.73 |
16.43 |
18.89 |
16.75 |
14.69 |
7.328 |
8.141 |
12.23 |
Т81 = |
Т82 = |
Т83 = |
Т84 = |
Т85 = |
Т86 = |
Т87 = |
Т88 = |
Т89 = |
Т90 = |
13.73 |
18.97 |
11.73 |
27.20 |
22.09 |
28.05 |
27.56 |
13.84 |
7.250 |
12.83 |
20
