DIMENSION d_mat(max_i-1,max_j),diag(max_j)
OPEN(2,FILE='matrix.txt',ERR=20)
d=0
l=1
DO 16 j=1,max_j,1
DO 15 i=1,max_j,1
IF (i.EQ.j) WRITE(2,9,ERR=21) diag(j)
IF (i.GT.j) THEN
IF (i.GE.j+max_i) THEN
WRITE(2,9,ERR=21) d
ELSE
WRITE(2,9,ERR=21) d_mat(j-i+max_i,i)
ENDIF
ENDIF
IF (i.LT.j) THEN
IF (j.GE.i+max_i) THEN
WRITE(2,9,ERR=21) d
ELSE
WRITE(2,9,ERR=21) d_mat(i-j+max_i,j)
ENDIF
ENDIF
15 CONTINUE
16 WRITE(2,8,ERR=21)
GOTO 17
8 FORMAT( )
9 FORMAT(\E12.4,';')
20 PRINT *,'Nevozmozhno otkrit fail'
er=1
GOTO 17
21 PRINT *,'O6ibka zapisi'
er=1
17 CLOSE(2)
END
PROGRAM main_print
COMMON /error/ er
COMMON /size/ max_i,max_j
COMMON /array/ a(200000000)
CALL input_matrix
IF (er.NE.0) GOTO 25
CALL printer(a(1),a((max_i-1)*max_j+1))
IF (er.NE.0) GOTO 25
PRINT *,'programma vipolnena uspe6no, rezultat v faile'
25 PAUSE
END
5. Тесты
1) обычная матрица
в плотном формате:
1 0 1 0 0 0
0 1 0 1 0 0
1 0 1 0 1 0
0 1 0 1 0 1
0 0 1 0 1 0
0 0 0 1 0 1
матрица: диагональ: вектор: результат:
3 6 1 6 4
0 1 1 1 6
0 1 1 2 9
0 1 1 3 12
0 1 1 4 8
0 0 1 5 10
0 0 6
2) Переполнение памяти. Данные хранятся в массиве из 200 000 000 элементов. N*L элементов для хранения матрицы AL, N элементов для хранения вектора, N элементов для хранения результата перемножения
Если N*L+2N превышает 200 000 000, возникает переполнение памяти.
“programma ne vipolnena”
3) Некорректность данных. Если щирина ленты больше размера матрицы, или если размер матрицы = 0 ,то «programma ne vipolnena»
4) тестирования с использованием генератора на матрицах больших размерностей прошло успешно
6. Исследование зависимости времени уменожения матрицы на вектор и времение считывания от размера записи и размерности матрицы
Ширину ленты взяли равной N/10
N |
Время умножения матрицы на вектор, ms |
Время считывания файла с прямым доступом(мс). Размер записи (байт), ms |
||||
4 |
8 |
16 |
32 |
64 |
||
10000 |
800 |
18950 |
10310 |
7110 |
4330 |
3360 |
20000 |
1710 |
36560 |
20500 |
12560 |
8670 |
6690 |
30000 |
2600 |
54710 |
30830 |
18950 |
12980 |
10000 |
40000 |
3510 |
72950 |
25240 |
25240 |
17250 |
13440 |
При увеличении размера записи считывание проходит быстрее. Это можно объяснить тем, что программа реже обращается к медленной внешней памяти и за одну итерацию получает больше значений переменных, что позволяет быстрее выполнить нужные действия.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.