spamsink: (Default)
[personal profile] spamsink posting in [community profile] besm6
В книге Мазного про МС "Дубна" в разделе 6.1.4 Использование динамической памяти в языке фортран
описана подсистема SYDAK (SYstem DAta Keeping), предназначенная для хранения большого объёма числовых данных в собственной динамической памяти объёмом до 256 К.

Я всю сознательную жизнь мечтал попробовать, как это работает, но то руки не доходили (на ВЦ АН), то оказывалось, что система отсутствует в организации (в ИТМ и ВТ). Наконец, руки дошли. На диске 2048 из ИТМ и ВТ SYDAK-а, как и ожидалось, нет, а на диске из С. Бора - есть, в *library:2.

Попробуем объявить массив размером 500х500 слов, расписать его элементы (i, j) значениями i*j, а потом проверить, правильно ли получилось.

Работает это так:
*NАМЕ
           *LIВRА:2
           *САLL СRЕАТЕ*
ВIG(500,500)                                           { так объявляется большой массив }
*ЕND SЕGМЕNТ                                           { в результате создается процедура DRUMCAT с описанием массивов }

 Ф О Р Т Р А Н
   /16.07.73/
                РRОGRАМ МАIN
                СОММОN IР(1)                           { база для работы с массивами  }
                DО 10 I=  1,500
       2        САLL GIVЕ(’ВIG’, I, L)                 { запрашиваем строку I, в  L будет смещение к базе}
       3        DО 20 J=1,500
       4    20  IР(L+J) = I*J                          { фактически BIG(I, J) = I*J }
       5        САLL ТАКЕ(’ВIG’, I)                    { закончили работу со строкой I, будет упрятана на барабан когда надо }
       6    10  СОNТINUЕ
       7        К = 0
       8        КК = 0
       9        DО 30 I = 1,500
      10        САLL GIVЕ(’ВIG’, I, L)
      11        DО 40 J=1,500
      12        К = К + I*J
      13        КК = КК + IР(L+J)
      14    40  СОNТINUЕ
      15        САLL ТАКЕ(’ВIG’, I)
      16    30  СОNТINUЕ
      17        РRINТ 50,К,КК
            50  FОRМАТ(1Х2I15)
                ЕND

           *ЕХЕСUТЕ
                                        ОТ 18.01.79 ==
                         ПОДПРОГРАММЫ ИЗ БИБЛИОТЕКИ    02    04.10.84 М1
                ТАКЕ        GIVЕ        SТАТISТ     SDRUМ*      GIVЕSТRN    РRIОRIТУ    ЕХСНАNGЕ    WRSЕСТ*
                NЕХТSЕСТ
                                        ОТ 18.01.79 ==


     15687562500    15687562500



Если не делать TAKE, то система не знает, какие строки массива можно прятать на барабан и печатается ПЕРЕПОЛНЕНО ОПЕРАТИВНОЕ РАБОЧЕЕ ПОЛЕ. Рабочим полем считается вся память от последнего использованного загрузчиком слова до начала стека. Если печатать значения L, получаемые после GIVE, то будет примерно
 ОFFSЕТ = 073070
 ОFFSЕТ = 072104
 ОFFSЕТ = 071120
 ОFFSЕТ = 070134
 ОFFSЕТ = 067150
 ОFFSЕТ = 066164
...
 ОFFSЕТ = 010250
 ОFFSЕТ = 007264
 ОFFSЕТ = 006300
 ОFFSЕТ = 073070
 ОFFSЕТ = 072104


и так далее по кругу. Память выделяется, начиная с верхних адресов, для совместимости с оверлеями (LOADGO). В системе предусмотрена оптимизация откачек. Для сложных последовательностей запросов к элементам нескольких массивов, как в задачах математической физики, рекомендуется первую итерацию вычислительного цикла проводить в режиме сбора статистики последовательности запросов (CALL REGIMS), а начиная со второй - в рабочем режиме (CALL REGIMW). На этом простом примере особой разницы не замечено.

Теоретически вместо откачки на МБ для позднейших версий ОС ДИСПАК можно было модифицировать систему для работы с дополнительными листами памяти задачи, используя экстракоды переименования листов.

Date: 2022-07-12 06:11 am (UTC)
vak: (Default)
From: [personal profile] vak
Прикольно, а я почему-то и не заметил этого в книжке Мазного.

Profile

Сообщество любителей БЭСМ-6

December 2025

S M T W T F S
 123456
78910111213
14151617181920
21222324252627
282930 31   

Most Popular Tags

Page Summary

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 13th, 2026 03:23 am
Powered by Dreamwidth Studios