Машина БЭСМ-6 и оценка её производительности в эмуляторе

—

от автора

Аннотация. БЭСМ-6 часто называют «миллионником»: её быстродействие оценивают в миллион операций в секунду. Но какие операции имеются в виду (FLOPS, KIPS) и что эта цифра может нам дать? В данной статье разберём устройство машины, её архитектуру и систему команд, запустим программы на эмуляторе Besm6.Net, а также оценим производительность на следующих бенчмарках: Dhrystone, Whetstone, Memspeed и MP-MFLOPS. Отдельно рассмотрим скорость эмуляции на современном компьютере и расчётное время выполнения на БЭСМ-6.

БЭСМ-6: центральный вычислитель и периферийные устройства в машинном зале

БЭСМ-6: центральный вычислитель и периферийные устройства в машинном зале

БЭСМ-6 в машинном зале. Источник фотографии.

Содержание

Зачем измерять БЭСМ-6 сегодня

Простой ответ — потому что можем. Сегодня программу для БЭСМ-6 можно написать в обычном текстовом файле и запустить в эмуляторе под Linux или Windows. Она напечатает знакомый Hello, World! или выполнит научный расчёт, всё это благодаря работе энтузиастов.

Действующая физическая машина для этого исследования недоступна, поэтому все практические результаты были получены в Besm6.Net — собственном эмуляторе на C# (.Net 8, на базе SIMH, Dubna Besm6 Emulator и документации), который я написал из любопытства (ну и желания попробовать агентную разработку с помощью ИИ). По ходу работы возникли два вопроса: насколько быстро современный компьютер исполняет программы БЭСМ-6 и сколько времени эти программы могли бы занять на исходной машине. Для эксперимента я выбрал мною любимые Dhrystone, Whetstone, Memspeed и MP-MFLOPS (оригиналы есть на языка C и Fortran): они нагружают разные части вычислительной системы и дают материал для сравнения.

В бенчмарках особенно заметна разница между правильным выполнением программы и точным воспроизведением её времени. Эмулятор может верно измерить скорость арифметики, но ошибиться в оценке в несколько раз, если его встроенная модель профилировки недостаточно учитывает работу конвейера и памяти. Даже совпадение одного сводного бенчмарка с опубликованным результатом не гарантирует полного совпадения в эмуляторе.

История: от МЭСМ к БЭСМ-6

История начинается с МЭСМ, введённой в эксплуатацию в 1951 году. За ней последовала первая БЭСМ: её изготовление завершили в 1952 году, приёмка состоялась в 1953-м. БЭСМ-2 стала серийным развитием первой машины; её выпуск начался примерно в 1958 году. Это была ещё ламповая техника. БЭСМ-4 представляла другую ветвь: её система команд продолжала линию М-20, а элементная база уже стала полупроводниковой.

Общее название серии не означает совместимости её машин: за номерами БЭСМ стояли разные архитектурные решения.

Подробнее об этой линии развития — в истории серии и музейных описаниях БЭСМ-2 и БЭСМ-4.

В начале 1960-х разрабатывалась архитектура новой машины для крупных научных расчётов — БЭСМ-6. Она прошла государственную приёмку в 1967 году. Главным конструктором был Сергей Алексеевич Лебедев, а ключевую роль в разработке играли Владимир Алексеевич Мельников и Леонид Николаевич Королёв. Серийное производство продолжалось с 1968 по 1987 год, всего изготовили 355 машин. Описание БЭСМ-6.

Переход к транзисторам позволял увеличить производительность, уменьшить габариты и энергопотребление. В описании БЭСМ-6 указаны около 60 тысяч транзисторов и 180 тысяч диодов. Логика строилась на дискретных элементах, поэтому скорость зависела и от конструкции: длины соединений, размещения блоков и монтажа. Процессор занимал стойки с ячейками и платами — типовыми элементами замены, или ТЭЗами. Их устройство подробно показано в блоге 1500py470.

Пульты позволяли наблюдать состояние машины и управлять её работой. Подробнее — в музейном описании и технической документации на пульты.

Машина с «водопроводом»

БЭСМ-6 совмещала работу устройства управления, арифметического устройства и памяти. Лебедев называл этот принцип «водопроводом». Сейчас мы сказали бы «конвейер»: пока одна операция вычисляет результат, для следующей уже можно готовить адрес или выбирать команду. Буферы между узлами сглаживали различия в скорости их работы. Описание архитектуры.

Но конвейер не отменяет зависимости. Если следующей команде нужен ещё не готовый результат, ей придётся ждать. Именно поэтому сумма задержек всех команд обычно не равна времени программы. Устройство управления может часть времени работать одновременно с арифметическим устройством, а конфликт обращений к памяти, наоборот, добавит ожидание.

Рис. 1 Перекрытие этапов выполнения команд в конвейере БЭСМ-6

Рис. 1 Перекрытие этапов выполнения команд в конвейере БЭСМ-6

Схема конвейерного выполнения. УУ — устройство управления, УВ — устройство выборки, АУ — арифметическое устройство, УЗ — устройство записи.

Рис. 2 Расположение основных стоек БЭСМ-6, вид сверху

Рис. 2 Расположение основных стоек БЭСМ-6, вид сверху

Основные стойки машины, вид сверху.

Оперативная память БЭСМ-6 была ферритовой: её кубы размещались в отдельных шкафах. Базовый объём — 32 768 слов по 48 бит, или 192 КиБ полезных данных. Физическое слово содержало ещё два контрольных разряда: всего 50 бит, из которых программисту доступны 48. В расширенных конфигурациях объём достигал 128 тысяч слов. Адресное пространство программы и установленная физическая память — разные величины: механизм «приписки», близкий к современной страничной виртуальной памяти, преобразовывал адреса страниц и обеспечивал защиту. [Учебник 1976 года, §§ 1–3][fortran-book].

Рис. 3 Рамка ферритовой памяти БЭСМ-6 с сердечниками и прошитыми проводами

Рис. 3 Рамка ферритовой памяти БЭСМ-6 с сердечниками и прошитыми проводами

Рамка с ферритовыми сердечниками из БЭСМ-6

Рис. 4 Куб ферритовой памяти БЭСМ-6 в Музее истории науки и техники ОИЯИ

Рис. 4 Куб ферритовой памяти БЭСМ-6 в Музее истории науки и техники ОИЯИ

Куб памяти БЭСМ-6 — сборка из ферритовых матриц. Экспонат Музея истории науки и техники ОИЯИ; рядом для масштаба лежит USB-накопитель. Источник: Лаборатория ядерных проблем ОИЯИ.

Рис. 5 Структурная схема процессора БЭСМ-6 и связи его основных устройств

Рис. 5 Структурная схема процессора БЭСМ-6 и связи его основных устройств

Структурная схема процессора БЭСМ-6.

Расслоение памяти позволяло обращаться к разным модулям с перекрытием во времени. Быстрые буферные регистры удерживали команды и данные, сокращая число обращений к ферритовой памяти. Для этого использовались четыре буферных регистра чтения чисел (БРЧ), четыре регистра командных слов (БРС) и восемь буферных регистров записи (БРЗ). Они работали автоматически, с ассоциативным поиском по адресу; программист не адресовал их как обычные регистры. По назначению эта сверхбыстрая буферная память близка к аппаратному кэшу. Подробнее — в [§ 3 учебника][fortran-book].

В описаниях машины встречается рабочая частота около 10 МГц. В таблице длительностей из учебника используется такт 110 нс, что соответствует примерно 9 МГц. Далее времена команд приведены именно в тактах этого источника. Частота синхронизации, длительность отдельной арифметической операции и среднее число завершённых команд в секунду — три разные характеристики. [§ 4 учебника][fortran-book].

Рис. 6 Стойка БЭСМ-6 с установленными типовыми элементами замены

Рис. 6 Стойка БЭСМ-6 с установленными типовыми элементами замены

Стойка с ТЭЗами.

Рис. 7 Проверка и отладка типового элемента замены БЭСМ-6

Рис. 7 Проверка и отладка типового элемента замены БЭСМ-6

Отладка типового элемента замены.

Система прерываний связывала вычисления с внешними событиями. Защита памяти и привилегированный режим давали диспетчеру возможность управлять несколькими задачами. Пользовательская программа не должна была самостоятельно распоряжаться всеми устройствами: она обращалась за обслуживанием к системному ПО.

Сравнение с аналогами

БЭСМ-6 часто сравнивают с машинами компании Control Data Corporation (CDC). С CDC 1604 её сближают, в частности, 48-разрядное машинное слово и 15-разрядная адресация. У CDC 6600 архитектура уже другая: 60-разрядное слово, десять функциональных блоков центрального процессора и десять периферийных процессоров. Документация CDC 6400/6600, 1966.

Параметр

БЭСМ-6

CDC 1604

CDC 6600

Год начала серийного выпуска

1968

1960

1964

Элементная база

Транзисторы

Транзисторы

Транзисторы

Разрядность слова

48 бит

48 бит

60 бит

Разрядность адреса

15 бит

15 бит

18 бит

Объём ОЗУ

32 768 слов

32 768 слов

До 131 072 слов

Потребляемая мощность

~20–50 кВт

~200–300 кВт

До 300 кВт

Занимаемая площадь

~150–225 м²

~150–200 м²

~400 м²

Ориентир быстродействия

1 млн операций/с

200 тыс. операций/с

3 млн операций/с

Объём памяти, мощность и площадь зависят от комплектации. Ориентиры быстродействия в этой таблице не получены на одной общей нагрузке.

Роль программного обеспечения хорошо видна на примере NCAR: сначала CDC 6600 оценивали как в 1,5 раза более быструю по сравнению с CDC 3600, а к 1968 году, после изменения программной системы, — уже в три раза. Перенести это отношение на БЭСМ-6 нельзя: для неё в том же сравнении нет результатов на общей нагрузке. Отчёт Lax, таблица NCAR.

Архитектура БЭСМ-6

Основная периферия машины

За два десятилетия комплектация машины менялась. В таблице собраны назначения устройств и параметры из конкретных описаний; состав оборудования отдельной БЭСМ-6 мог отличаться.

Устройство

Назначение

Что важно для программы

Устройства чтения перфокарт семейства ВУ-700

Ввод исходного текста и данных

Обычно 80 колонок на карте; перестановка карт меняла задание

АЦПУ-128

Печать листинга и результатов

128 печатных позиций; скорость зависит от исполнения устройства

Телетайп

Команды и сообщения оператору, работа с текстом

Медленный последовательный обмен; не измеритель скорости процессора

НМЛ, магнитная лента

Библиотеки, программы, массивы данных

Учебник описывает до 32 магнитофонов; обмен зонами по 1К слов

НМБ, магнитный барабан

Внешняя память с адресуемыми блоками

Учебник указывает до 512К слов суммарной барабанной памяти; блок 1К или 256 слов

НМД, магнитный диск

Внешняя память более поздних конфигураций

В описанной комплектации блок 1К слов соответствует двум дорожкам; скорость зависит от накопителя

Устройства и объёмы внешней памяти перечислены в [§ 1 учебника][fortran-book]. Для АЦПУ-128-2 НИИсчётмаш указывает 128 печатных позиций в строке и скорость 380–440 строк/мин. В той же исторической справке института описано устройство ввода ВУ-700-2.

Печать, внешняя память и ввод

Рис. 8 Алфавитно-цифровое печатающее устройство АЦПУ-128-3

Рис. 8 Алфавитно-цифровое печатающее устройство АЦПУ-128-3

АЦПУ-128-3 — один из вариантов печатающего устройства семейства АЦПУ-128. Фото: Radiolok, Wikimedia Commons, CC BY-SA 4.0. Изображение без изменений.

Рис. 9 Накопители БЭСМ-6 на магнитных барабанах

Рис. 9 Накопители БЭСМ-6 на магнитных барабанах

Магнитные барабаны внешней памяти БЭСМ-6. Источник: интервью Владимира Воробьёва, опубликованное DataArt.

Рис. 10 Накопитель на сменных магнитных дисках ЕС-5052 с видимым пакетом дисков

Рис. 10 Накопитель на сменных магнитных дисках ЕС-5052 с видимым пакетом дисков

ЕС-5052 — пример накопителя на сменных магнитных дисках того периода. Конкретная модель дискового устройства зависела от комплектации вычислительного центра. источник — OldPC.

Рис. 11 Устройство чтения перфокарт ВУ-700-2

Рис. 11 Устройство чтения перфокарт ВУ-700-2

ВУ-700-2 — устройство ввода с 80-колонных перфокарт. Иллюстрация из каталога технических средств, 1975, с. 166; извлечён фрагмент страницы с фотографией.

![Рис. 11.1 Непосредственно перфокарта

Перфокарта. 80-колонок. Содержала 1 строку кода.

Как программа попадала в машину

Рис. 12 Структура 80-колоночной перфокарты

Рис. 12 Структура 80-колоночной перфокарты

Разметка перфокарты: строка программы превращается в набор отверстий.

На одной перфокарте обычно размещалась одна строка программы на языке высокого уровня, запись на автокоде или порция данных. Поля карты имели разное назначение:

Рис. 13 Поля перфокарты для записи исходного текста программы

Рис. 13 Поля перфокарты для записи исходного текста программы

Расположение полей исходного текста на перфокарте.

Рис. 14 Фрагмент блока питания БЭСМ-6

Рис. 14 Фрагмент блока питания БЭСМ-6

Блок питания — ещё одна часть инфраструктуры машины, занимавшей целый зал.

Основные регистры

В выполнении программы участвуют сумматор, регистр младших разрядов, счётчик команд, регистры режима и изменения команд, а также индексные регистры. Их назначение описано в [§ 4 учебника][fortran-book].

Рис. 15 Основные регистры БЭСМ-6, их разрядность и назначение

Рис. 15 Основные регистры БЭСМ-6, их разрядность и назначение

Регистр

Размер

Назначение

A, сумматор

48 бит

Основной регистр для арифметических и логических операций

Y, регистр младших разрядов (РМР)

48 бит

Младшие разряды результата и данные для операций сдвига

K, счётчик команд (СчАК)

15 бит

Адрес слова с выполняемой командой; половина слова учитывается отдельно

R, регистр режима и блокировок

6 бит

Режим арифметики и признаки группы операций

C, регистр изменения команд

15 бит

Модификация исполнительного адреса после UTC или WTC

Регистр R содержит шесть признаков. Здесь разряды пронумерованы справа налево, начиная с единицы, как в учебнике:

Разряд

Назначение

1

Блокировка нормализации

2

Блокировка округления

3

Признак логической группы

4

Признак группы умножения

5

Признак группы сложения

6

Блокировка прерывания по переполнению

Индексные регистры. В командах БЭСМ-6 предусмотрены 16 номеров индексных регистров — M₀–M₁₅. Каждый имеет разрядность 15 бит; нулевой номер соответствует нулевому значению. Содержимое индексного регистра можно передать в 15 младших разрядов сумматора и обратно. Индексные регистры используются для:

  • модификации адреса — содержимое регистра добавляется к адресной части команды;

  • организации циклов — регистр хранит счётчик;

  • временного хранения адресов и служебной информации.

Роли конкретных индексных регистров:

  • M₀ всегда даёт нулевое значение;

  • M₁–M₁₄ используются для обычной индексации;

  • M₁₅ (М017 в восьмеричной записи) служит указателем стека, или «магазина». Для соответствующих команд его использование включает магазинную адресацию с автоматическим увеличением или уменьшением указателя.

В документации индексные регистры часто нумеруются в восьмеричном виде от М000 до М017.

48-разрядное машинное слово

48-разрядное машинное слово — естественная единица хранения и адресации в БЭСМ-6. В нём помещаются две команды по 24 бита или одно число.

Рис. 16 Разряды 48-битного машинного слова БЭСМ-6

Рис. 16 Разряды 48-битного машинного слова БЭСМ-6

В книжной документации разряды нумеруются справа налево, начиная с единицы. В коде симулятора часто используется нумерация с нуля — эти обозначения нужно различать. Для записи машинных кодов и адресов обычно применяют восьмеричную систему: одной цифре соответствуют три двоичных разряда. Суффикс В или B в исторических примерах обозначает восьмеричное число.

При размещении двух команд слово делится на левую и правую половины:

Рис. 17 Две 24-разрядные команды в одном машинном слове

Рис. 17 Две 24-разрядные команды в одном машинном слове

Часть машинного слова

Разряды

Левая команда

48–25

Правая команда

24–1

Числа с плавающей запятой. Если слово содержит число, его разряды распределяются следующим образом:

Поле числа

Разряды

Знак порядка

48

Порядок

47–42

Знак мантиссы

41

Мантисса

40–1

Поля числа с плавающей запятой: порядок, знак и мантисса

Поля числа с плавающей запятой: порядок, знак и мантисса

Положительная мантисса записывается в прямом коде, отрицательная — в дополнительном. Порядок хранится со смещением 64: семи старшим разрядам соответствует значение 64+P, где P лежит в диапазоне от -64 до +63. В восьмеричной записи смещение 64 обозначается как 100B.

Значение числа равно M\cdot 2^P. Положительная нормализованная мантисса лежит в диапазоне от 0{,}5 до 1-2^{-40}; модуль отрицательной нормализованной мантиссы больше 0{,}5. Для нормализованных чисел диапазон составляет примерно от 10^{-19} до 10^{19} по модулю. Нижняя граница — 2^{-65}, верхняя для положительных чисел — 2^{63}(1-2^{-40}). Для ненормализованных значений нижняя граница снижается до 2^{-104}; меньшие по модулю значения обращаются в машинный нуль. [Представление чисел в учебнике][fortran-book].

Мантисса содержит знак и 40 дробных разрядов — примерно 12 десятичных значащих цифр. REAL БЭСМ-6 отличается от современных форматов IEEE 754 float и double. При переносе бенчмарка нужно учитывать эту разницу и правила округления.

Целые числа и текст. Логическое слово может хранить маску, текстовые символы или целочисленное значение. Представление INTEGER зависит от языка и транслятора. В описанном варианте Фортрана целые числа хранятся в ненормализованном виде с порядком 40: запятая оказывается после младшего разряда мантиссы. Полного отдельного набора целочисленных арифметических операций у машины нет. Вообще, целочисленные операции были исключены намеренно, т.к. БЭСМ-6 создавалась исключительно как суперкомпьютер для автоматизации сложных научно-технических расчетов. В этих вычислениях абсолютное большинство данных требовало вещественных чисел (с плавающей запятой повышенной точности).

Понятия “байт” размером 8 бит тоже не предусмотрено. Для текста в одно слово обычно упаковывают до шести символов, а конкретная упаковка зависит от кодировки.

Система команд

В 48 разрядное слово записываются 2 команды размерностью 24 бита.

24-разрядная команда БЭСМ-6 имеет один из двух форматов. Числа в описании полей обозначают их длину в битах:

Формат

Поля от старших разрядов к младшим

Зачем нужен

Короткий адрес

индекс 4; признак 0; расширение адреса 1; операция 6; адрес 12

Больше кодов операций, ограниченный непосредственный адрес

Длинный адрес

индекс 4; признак 1; операция 4; адрес 15

Полный адрес, в частности для переходов и индексных команд

Рис. 18 Поля команды БЭСМ-6 с коротким адресом

Рис. 18 Поля команды БЭСМ-6 с коротким адресом

Команда с коротким адресом.

Рис. 19 Поля команды БЭСМ-6 с длинным адресом

Рис. 19 Поля команды БЭСМ-6 с длинным адресом

Команда с длинным адресом.

Ниже приведены основные команды и их характеристики из [приложения 1 к учебнику][fortran-book]. Рядом с латинскими мнемокодами МАДЛЕНа указаны русские обозначения команд БЭСМ-6 и мнемокоды БЕМШа — по сводной таблице команд. Эти обозначения относятся к разным системам записи, поэтому смешивать их в исходном тексте программы нельзя. Экстракоды рассмотрим отдельно.

КОП — восьмеричный код операции; A — сумматор; Y — регистр младших разрядов. «Не изм.» — не изменяется, «изм.» — изменяется, «не опр.» — не определено. Время дано отдельно для устройства управления (УУ) и арифметического устройства (АУ), в тактах по 110 нс. Эти интервалы нельзя просто складывать для оценки всей программы: работа устройств перекрывается во времени. Обозначение \omega в строках условных переходов — условие, определяемое группой операций и содержимым сумматора; это не отдельный разряд регистра R.

Рис. 20 Табличка со списком кодов операций на БЭСМ-6

Рис. 20 Табличка со списком кодов операций на БЭСМ-6

Список кодов операций на самой машине.

Таблицы команд: регистры, группы операций и время выполнения

Команды с коротким адресом

КОП

МАДЛЕН (лат.)

БЭСМ-6 (рус.)

БЕМШ (рус.)

A

Y

Группа

В УУ

В АУ: min

В АУ: средн.

В АУ: max

Содержание операции

000

ATX

ЗЧ (ЗП)

ЗП

не изм.

не изм.

не изм.

3

3

3

3

Запись слова в память

001

STX

ЗМ

ЗПМ

изм.

не изм.

логич.

6

5

6

6

Запись и магазинное считывание

003

XTS

СМ

СЧМ

изм.

не изм.

логич.

6

5

6

6

Магазинная запись и считывание

004

A+X

АС

СЛ

изм.

изм.

слож.

3

5

11

280

Сложение

005

A-X

АВ

ВЧ

изм.

изм.

слож.

3

5

11

280

Вычитание

006

X-A

ОВ

ВЧОБ

изм.

изм.

слож.

3

5

11

280

Обратное вычитание

007

AMX

МВ

ВЧАБ

изм.

изм.

слож.

3

5

11

280

Вычитание модулей

010

XTA

СЧ

СЧ

изм.

не изм.

логич.

3

2

2,5

3

Считывание слова из памяти

011

AAX

ЛУ

И

изм.

нуль

логич.

3

4

4

4

Логическое умножение

012

AEX

СР (ЛВ)

НТЖ

изм.

изм.

логич.

3

2

2,5

3

Поразрядное сравнение

013

ARX

ЦС

СЛЦ

изм.

нуль

умнож.

3

3

6

27

Циклическое сложение

014

AVX

ИЗ

ЗНАК

изм.

нуль

слож.

3

4

5

25

Изменение знака числа

015

AOX

ЛС

ИЛИ

изм.

нуль

логич.

3

4

4

4

Логическое сложение

016

A/X

АД

ДЕЛ

изм.

не опр.

умнож.

3

47

50

174

Деление

017

A*X

АУ

УМН

изм.

изм.

умнож.

3

15

18

162

Умножение

020

APX

СБ

СБР

изм.

нуль

логич.

3

53

53

53

Сборка

021

AUX

РБ

РЗБ

изм.

нуль

логич.

3

53

53

53

Разборка

022

ACX

ВЧ

ЧЕД

изм.

нуль

логич.

3

54

56

78

Подсчёт числа единиц

023

ANX

ВН

НЕД

изм.

изм.

логич.

3

7

32

78

Определение номера старшей единицы

024

E+X

СП

СЛП

изм.

нуль

умнож.

3

3

5

133

Сложение порядков

025

E-X

ВП

ВЧП

изм.

нуль

умнож.

3

3

5

133

Вычитание порядков

026

ASX

СК

СД

изм.

изм.

логич.

3

4

нет

68

Сдвиг по коду порядка

027

XTR

РК

РЖ

не изм.

не изм.

регистр.

3

2

2,5

3

Установка режима

030

RTE

ВР

СЧРЖ

изм.

не изм.

не изм.

3

2

3

3

Выдача содержимого регистра признаков

031

YTA

МР

СЧМР

изм.

не изм.

не изм.

3

3

5

133

Выдача младших разрядов

034

E+N

КС

СЛПА

изм.

нуль

умнож.

3

3

5

133

Сложение порядка с адресом

035

E-N

КВ

ВЧПА

изм.

нуль

умнож.

3

3

5

133

Вычитание из порядка адреса

036

ASN

СД

СДА

изм.

изм.

логич.

3

4

нет

68

Сдвиг по адресу

037

NTR

РА

РЖА

не изм.

не изм.

регистр.

3

2

2,5

3

Установка режима по адресу

040

ATI

УИ

УИ

не изм.

не изм.

не изм.

14

3

3

3

Запись из сумматора в индекс-регистр

041

STI

УМ

УИМ

изм.

не изм.

логич.

14

3

3

3

Запись из сумматора в индекс-регистр и магазинное считывание

042

ITA

ВИ

СЧИ

изм.

не изм.

логич.

6

3

3

3

Считывание индекс-регистра на сумматор

043

ITS

ВМ

СЧИМ

изм.

не изм.

логич.

9

5

6

6

Магазинная запись и считывание индекс-регистра на сумматор

044

MTJ

ПИ

УИИ

не изм.

не изм.

не изм.

6

—

—

—

Передача кода из индекс-регистра в индекс-регистр

045

J+M

СИ

СЛИ

не изм.

не изм.

не изм.

6

—

—

—

Сложение кода в индекс-регистрах

Команды с длинным адресом

КОП

МАДЛЕН (лат.)

БЭСМ-6 (рус.)

БЕМШ (рус.)

A

Y

Группа

В УУ

В АУ: min

В АУ: средн.

В АУ: max

Содержание операции

22

UTC

ИА

МОДА

не изм.

не изм.

не изм.

4

—

—

—

Запись адреса в регистр изменения команд

23

WTC

ИК

МОД

не изм.

не изм.

не изм.

13

3

3

3

Запись 15 младших разрядов слова в регистр изменения команд

24

VTM

ПА

УИА

не изм.

не изм.

не изм.

4

—

—

—

Передача адреса в индекс-регистр

25

UTM

СА

СЛИА

не изм.

не изм.

не изм.

4

—

—

—

Сложение индекс-регистра с адресом

26

UZA

У0

ПО

не изм.

нуль

не изм.

15; 12

3

3

3

Условный переход при \omega=0

27

U1A

У1

ПЕ

не изм.

нуль

не изм.

15; 12

3

3

3

Условный переход при \omega=1

30

UJ

ПБ

ПБ

не изм.

не изм.

не изм.

7

—

—

—

Безусловный переход

31

VJM

ПВ

ПВ

не изм.

не изм.

не изм.

7

—

—

—

Безусловный переход с запоминанием адреса возврата в индекс-регистре

34

VZM

И0

ПИО

не изм.

не изм.

не изм.

7; 4

—

—

—

Условный переход по нулевому коду в индекс-регистре

35

V1M

И1

ПИНО

не изм.

не изм.

не изм.

7; 4

—

—

—

Условный переход по ненулевому коду в индекс-регистре

37

VLM

КЦ

ЦИКЛ

не изм.

не изм.

не изм.

7; 4

—

—

—

Конец цикла

32

IJ

Э32

ВЫПР

не изм.

не изм.

не изм.

7

—

—

—

Выход из прерывания (только в режиме диспетчера)

Арифметика и адресация

Арифметика строится вокруг сумматора A. Одноадресная команда получает второй операнд из памяти, а первый уже должен находиться в сумматоре. Регистр младших разрядов Y дополняет арифметический тракт при операциях с расширенным результатом и сдвигах. Индексные регистры участвуют в вычислении адресов и организации циклов. Счётчик команд K вместе с признаком левой или правой половины слова определяет место исполнения. [Регистры и команды][fortran-book].

При выполнении арифметических операций машинное слово рассматривается как число с плавающей запятой. Целочисленные значения также обрабатываются с учётом принятого способа представления.

Арифметические операции могут выполняться в одном из четырёх режимов:

  • с нормализацией и с блокировкой округления;

  • с нормализацией и с округлением;

  • с блокировкой нормализации и с округлением;

  • с блокировкой нормализации и с блокировкой округления.

После выполнения операций A+X, A-X, X-A, AMX, A*X мантисса результата состоит из 80 разрядов, причём младшие 40 разрядов располагаются в регистре Y. Их можно передать в сумматор командой YTA. [Особенности арифметических операций][fortran-book].

Экстракоды

Через [экстракоды][fortran-book] пользовательская задача обращается к диспетчеру: запрашивает обмен с внешними устройствами, вычисление элементарной функции или другую системную услугу. Ближайшая современная аналогия — системный вызов, например syscall, или программное прерывание вроде int 21h в DOS.

Экстракод передаёт управление системной программе. Прикладной программист задаёт запрос и параметры, а подробности обслуживания остаются у системы. Набор услуг и соглашения об аргументах зависят от программного окружения.

В системе «Дубна», например, *50 вычисляет sqrt, *51 — sin, *52 — cos, *53 — arctan, а *64 используется для печати. Для оценки производительности это существенная деталь: один экстракод может скрывать работу целой подпрограммы.

Программное обеспечение БЭСМ-6

Операционные системы БЭСМ-6

Программу исполняла целая система: диспетчер распределял ресурсы и обслуживал устройства, транслятор переводил исходный текст в машинные команды, библиотеки предоставляли готовые подпрограммы. Выбор этого окружения влиял и на удобство работы, и на быстродействие.

«Диспетчер-68» (Д-68). Первую ОС для БЭСМ-6 разработали в ИТМиВТ под руководством Л. Н. Королёва. История программного обеспечения машины.

Возможности системы:

  • мультипрограммная работа — обслуживание нескольких задач;

  • управление внешней памятью и устройствами ввода-вывода;

  • совмещение вычислений с работой периферии;

  • динамическое распределение оперативной и внешней памяти;

  • многотерминальная работа в диалоговом режиме.

Средства работы в реальном времени и построения многомашинных комплексов развивались уже в последующих системах.

ДИСПАК. Одна из наиболее известных систем БЭСМ-6, созданная под руководством В. Ф. Тюрина. История её развития описана в материалах об операционной системе ДИСПАК.

Возможности системы:

  • пакетная и диалогово-пакетная обработка заданий;

  • автоматизация запуска пользовательских задач и многозадачность;

  • буферизация ввода-вывода;

  • работа в составе многомашинных вычислительных комплексов (МВК): с 1972 года — общая внешняя память на магнитных дисках и автоматическое перераспределение задач между машинами.

Развитием этого направления стала диалогово-пакетная система ДИАПАК. Работа подобных комплексов требовала настройки под конкретную аппаратную конфигурацию и набор задач.

Мониторная система «Дубна». Для наших экспериментов особенно важна система, использовавшаяся в ОИЯИ. Она обеспечивала обработку пакетов заданий, вызов трансляторов, подключение библиотек и запуск программ. Её устройство описано в [§ 7 учебника][fortran-book]. Именно с её заданиями в формате .dub мы будем работать ниже.

Процесс разработки ПО

  1. Алгоритм. Программист разбивал задачу на шаги, строил блок-схему, определял входные данные и промежуточные результаты.

  2. Исходный текст. Программу записывали в тетради или на бланках. В зависимости от задачи и доступного ПО выбирали машинные коды, автокод или язык высокого уровня.

  3. Ввод и трансляция. Текст переносили на перфокарты либо перфоленту с помощью специального оборудования. Транслятор проверял синтаксис и выдавал листинг с диагностикой.

  4. Отладка. Программу запускали на тестовых данных. Для поиска ошибок печатали промежуточные значения на АЦПУ, использовали трассировку и контрольные точки — в пределах возможностей выбранной системы.

  5. Работа с ОС и аппаратурой. Нехватка памяти, ошибки обмена и аппаратные сбои могли потребовать совместной работы программиста и инженера.

  6. Проверка результата. Выходные данные сопоставляли с теоретическими расчётами и проверяли на граничных случаях. При расхождениях исправляли алгоритм или код и повторяли запуск.

Языки программирования

На низком уровне использовались автокоды — языки ассемблера с мнемоническими обозначениями команд. Пример такого языка описан в инструкции «Автокод БЭСМ-6» 1969 года. Среди известных автокодов машины — [МАДЛЕН][fortran-book] и БЕМШ. В системе «Дубна» МАДЛЕН служил и самостоятельным языком, и промежуточным представлением при трансляции подпрограмм с Фортрана.

Пример программы на МАДЛЕНе:

*name мадлен*madlen program: ,name,          ,*64 , inf64          ,*74 , inf64:   ,    , text          ,    , text          ,001 ,         8,    , text:    ,gost, 18h Hello, World!'214'          ,gost, 6h'231'          ,end ,*execute*end file

Пример программы на БЕМШе:

*name бемш*bemshввд$$$prog    старт   512        э64     инф64        пб      (13)инф64   мода    текст        мода    текст        конк    к'000010000'        конк    к'100000000'текст   текст   п'Приветик! Это автокод БЕМШ.'        конд    м40b'231'        финишквч$$$трн$$$0-0блмакбтмалфкнц$$$*main prog*execute*end file

Для научных задач часто выбирали Фортран; широко применялся и Алгол-60. На БЭСМ-6 также использовались Паскаль, ЛИСП и РЕФАЛ. Для Фортрана существовало несколько трансляторов и вариантов языка, в том числе Фортран-Дубна, Фортран-ГДР и ФОРЕКС.

Простая программа на Фортране:

*name фортран*fortran        program hello        print 1000        stop 1000   format('Hello, World!')        end*execute*end file

Симуляторы БЭСМ-6

Запускать программы БЭСМ-6 на современных компьютерах позволяют несколько проектов.

SIMH. В проекте Simulator of Historical Computers реализована поддержка БЭСМ-6. Симулятор позволяет запускать ДИСПАК и прикладные программы. Исполняемый файл называется b6; при запуске без параметров он переходит в диалоговый режим. Руководство по SIMH для БЭСМ-6.

Dubna BESM-6 Emulator. Проект воссоздаёт окружение мониторной системы «Дубна», использовавшейся в ОИЯИ. Он обрабатывает исторические файлы заданий и воспроизводит характерный вывод: кириллические заголовки, листинги Фортрана, графику плоттера. Репозиторий besm6/dubna.

Besm6.Net. Для исследования архитектуры и запуска прикладного кода я разработал симулятор на C# с помощью ИИ. При работе опирался на SIMH, Dubna BESM-6 Emulator и документацию машины. Репозиторий EntityFX/besm6.net.

Архитектурно проект разбит на несколько слоёв:

  • Besm6.Architecture описывает 48-разрядное слово, арифметику и контракты процессора.

  • Besm6.Processor реализует логику процессора.

  • Besm6.Runtime связывает процессор, память, загрузчик, экстракоды и устройства.

  • Besm6.Cli предоставляет интерфейс командной строки: загружает задание .dub, запускает трансляцию и выполнение, выводит результат.

Симулятор работает с образами лент и выводит текст в терминал хоста. В описанных опытах механическое движение ленты и печать на АЦПУ не моделируются.

Сборка Besm6.Net и первый запуск

Проект ориентирован на net8.0; для сборки нужен SDK .NET 8. Клонируем репозиторий, собираем CLI и запускаем пример. Команды ниже записаны для Bash:

git clone https://github.com/EntityFX/besm6.netcd besm6.net# Сборкаdotnet build src/Besm6.Cli -c ReleaseDLL=src/Besm6.Cli/bin/Release/net8.0/besm6.dll# Запускdotnet "$DLL" run examples/fortran.dub --no-wall-clock

Для запуска используются пять образов лент с оригинальным ПО: monsys.9, librar.12, librar.37, bemsh.739 и b.7. Они находятся в tapes/ и копируются при сборке.

Состав образов этих лент:

  • monsys.9 — образ системной магнитной ленты, содержащий саму мониторную систему (MONITOR SYSTEM). По умолчанию эмуляторы БЭСМ-6 подключают этот файл для загрузки базовой программной среды ОС «Дубна». • librar.12 и librar.37 — файлы библиотек (LIBRARY). На БЭСМ-6 в таких файлах хранились стандартные математические подпрограммы, компиляторы (например, Фортран) и системные утилиты. • bemsh.739 — образ компилятора автокода БЕМШ. • b.7 — образ с компилятором языка B.

Путь можно задать явно в JSON вместе с параметрами временной модели:

{  "tapes": "/absolute/path/to/besm6.net/tapes",  ...}

Сохраните конфигурацию, например, в article-config.json, заменив путь к лентам своим. При запуске передайте --config article-config.json.

Бенчмарки и методика измерений

Исходные задания находятся в каталоге examples. Всего используются восемь заданий: по одному для Dhrystone и Whetstone, по три для Memspeed и MP-MFLOPS.

Семейство

Задание

Нагрузка и показатель

Dhrystone 2.1

dhrystone-forex.dub

5000 проходов; процедуры, строки, целочисленные массивы; DMIPS

Whetstone, вариант Роя Лонгботтома

whetstone-longbottom-forex.dub

8 × 100 условных проходов; восемь секций; MWIPS и отдельный MFLOPS

Memspeed

memspeed-forex.dub, части 1–3

4096 элементов, 1000 проходов; copy, add, multiply-add; логические MB/s

MP-MFLOPS

mpmflops-forex.dub, части 1–3

9000 элементов, 30 проходов; 2, 8 и 32 арифметические операции на элемент; MFLOPS

При переносе потребовались адаптации кода, чтобы старые компиляторы могли собрать код.

  • В Dhrystone записи заменены параллельными массивами полей, а указатели — индексами двух узлов. Строки и вызовы процедур сохранены.

  • Из Memspeed перенесены три ядра: копирование, сложение и умножение со сложением.

  • В MP-MFLOPS используется 48-разрядный тип REAL. Название семейства сохранено, но здесь выполняется последовательный вариант вычислительных ядер.

  • Whetstone взят в варианте Роя Лонгботтома 1996 года. Порт сохраняет восемь секций и их число операций, а длинные циклы разбивает на блоки для совместимости с ограничениями старого Фортрана.

Настроки запуска эмулятора Besm6.Net

Во всех заданиях системная функция CTIME вызывается перед вычислительным ядром бенчмарка и сразу после него. Подготовка массивов, компиляция, проверка результата и печать находятся за пределами измеряемого интервала. В этих заданиях счётное время берётся из второго аргумента CTIME.

Источник времени зависит от режима симулятора:

Режим Besm6.Net

Источник гостевого времени

Темп выполнения

original

Статистическая модель времени БЭСМ-6

Симулятор при необходимости ожидает, чтобы выдержать модельный темп

virtual

Реальное прошедшее время на хосте

Выполнение с доступной скоростью хоста

max

Счётчик модельных тактов

Выполнение с доступной скоростью хоста, без ожидания модельного темпа

Параметр --guest-clock включает гостевой таймер. Часы хоста используются именно в режиме virtual; в других режимах таймер получает модельное время. Подробности реализации приведены в описании временной модели и режимов выполнения.

На результат virtual влияют процессор хоста, среда выполнения .NET, JIT-компиляция, ОС и другие процессы. В original гостевое время определяется моделью, даже если хост способен выполнить команды быстрее.

Точная модель исполнения и её калибровка

В режиме original симулятор учитывает задержки устройства управления и арифметического устройства, зависимости между командами, обращения к банкам памяти, попадания в буферы и запись результатов. Исходные интервалы взяты из [учебника 1976 года][fortran-book] и [таблиц команд][fortran-book]. Часть задержек при этом остаются предполагаемыми.

Используются два эмпирических коэффициента: общий масштаб времени 0.670839 и дополнительный масштаб математических функций 1.769005. Их подобрали по опубликованному эксперименту Leo B. с Whetstone в 2017 году: по сумме времён секций и отдельно по сумме секций с математическими функциями. Этот эксперимент также выполнен на модели БЭСМ-6; это прямо указано в его выводе.

Калибровка согласует общий MWIPS с выбранной публикацией. Сам Whetstone после этого не может служить независимой проверкой точности. Остальные тесты показывают поведение модели за пределами калибровочной нагрузки, но для проверки исторического времени всё равно нужны результаты физической машины. Даже совпадение общего MWIPS не означает совпадения всех восьми секционных времён.

Задержки математических экстракодов задаются отдельно. Например, исходные оценки для квадратного корня и синуса составляют 40 и 50 мкс до применения коэффициентов. В [§ 6 учебника][fortran-book] для элементарных функций указан диапазон 55–90 мкс; отдельно оговорено округление вниз.

Среда запуска эмулятора и проверка нескольких прогонов

Сборка выполнена в конфигурации Release. Хост — Linux x86-64 с Intel Xeon E5-2680 v3, паспортная частота 2,50 ГГц; версия среды выполнения .NET — 8.0.21. Для каждого из восьми заданий выполнено по три отдельных запуска в original и virtual — всего 48, последовательно, без конкурирующих бенчмарков. Каждый процесс заново загружает и транслирует программу.

Шаг гостевого таймера — 20 мс. Для коротких интервалов существенный разброс: при длительности 0,3 с один шаг составляет около 7%. Три повтора позволяют увидеть разброс, но не обеспечивают точности до шестого знака. В основной таблице приведены медианы, а минимум и максимум — в подробной. Полный прогрев и управление частотой процессора в методику не входили, поэтому эти результаты характеризуют запуск на доступном хосте.

Результат включался в таблицу только после завершения программы инструкцией STOP и прохождения численных проверок. Дополнительно внешний Python-скрипт пересчитывал результаты бенчмарков и их контрольные значения: для Memspeed — первый и последний элементы и сумму, для MP-MFLOPS — последовательность арифметических выражений, для Whetstone — восемь эталонных значений с допуском. Анализировался вывод после компоновщика: строка ALL VALUES MATCH, напечатанная в листинге исходного текста, ещё не подтверждает успешного выполнения.

Каждый тест можно выполнить отдельно:

DLL=src/Besm6.Cli/bin/Release/net8.0/besm6.dlldotnet "$DLL" run examples/dhrystone-forex.dub \  --guest-clock --speed virtual --stats --no-wall-clock \  --no-hang-detect --limit 2000000000

Как считаются результаты

Dhrystone. Число проходов делится на время в секундах, затем на 1757 — принятую нормировку относительно VAX-11/780. DMIPS не равно числу миллионов гостевых машинных команд в секунду. Счётчик инструкций CLI включает работу транслятора и обслуживающих модулей, поэтому напрямую сопоставлять его с DMIPS нельзя. Описание нормировки в архиве Netlib.

Whetstone. Для выбранной нагрузки общий результат бенчмарка вычисляется как 80 / сумма нормализованных секунд и выражается в MWIPS. Отдельный показатель MFLOPS — среднее геометрическое арифметических секций N1, N2 и N6. Остальные секции включают условные переходы, целочисленные операции, присваивания и математические функции; их MOPS нельзя складывать с MFLOPS.

Memspeed. Здесь измеряется логическая скорость обработки данных в памяти. Слово содержит шесть полезных байт: копирование читает и записывает слово, то есть учитывает 12 байт на элемент. Сложение и multiply-add учитывают два чтения и одну запись — 18 байт. При 4096 элементах и 1000 проходах получаются 49 152 000 и 73 728 000 байт. MB/s — десятичные мегабайты в секунду, по миллиону байт.

MP-MFLOPS. Число 9000 × 30 × операций_на_элемент делится на время в секундах и миллион. Три подтеста выполняют 540 тысяч, 2,16 миллиона и 8,64 миллиона арифметических операций. Умножение и сложение считаются отдельно. С ростом числа операций на элемент уменьшается доля индексной арифметики и управления циклом, но длинная цепочка зависимых вычислений может ограничивать работу конвейера.

Результаты

Таблица показывает медианы трёх запусков для каждой пары задания и режима. Время Whetstone — сумма нормализованных секционных времён; для остальных тестов указан интервал выполнения ядра. Во всех строках original используется одна и та же настроенная временная модель.

Бенчмарк

Время original, с

Результат в original

Время virtual, с

Результат в virtual

Единица

Dhrystone 2.1

4,360

0,653

0,340

8,370

DMIPS

Whetstone

98,850

0,809

4,974

16,084

MWIPS

Memspeed: copy

8,680

5,663

0,960

51,200

MB/s

Memspeed: add

16,740

4,404

1,220

60,433

MB/s

Memspeed: multiply-add

17,640

4,180

1,480

49,816

MB/s

MP-MFLOPS: 2 операции

1,100

0,491

0,080

6,750

MFLOPS

MP-MFLOPS: 8 операций

3,340

0,647

0,240

9,000

MFLOPS

MP-MFLOPS: 32 операции

13,540

0,638

0,820

10,537

MFLOPS

Подробные результаты: медиана, минимум и максимум трёх прогонов

Бенчмарк

Режим

Число прогонов

Медиана

Минимум

Максимум

Единица

Dhrystone 2.1

original

3

0,652697

0,652697

0,652697

DMIPS

Dhrystone 2.1

virtual

3

8,369882

8,369882

8,369882

DMIPS

Whetstone

original

3

0,809307

0,809307

0,809307

MWIPS

Whetstone

virtual

3

16,083635

16,083635

16,474465

MWIPS

Memspeed: copy

original

3

5,662673

5,662673

5,662673

MB/s

Memspeed: copy

virtual

3

51,200000

39,638710

54,613333

MB/s

Memspeed: add

original

3

4,404301

4,404301

4,404301

MB/s

Memspeed: add

virtual

3

60,432787

49,816216

62,481356

MB/s

Memspeed: multiply-add

original

3

4,179592

4,179592

4,179592

MB/s

Memspeed: multiply-add

virtual

3

49,816216

39,638710

51,200000

MB/s

MP-MFLOPS: 2 операции

original

3

0,490909

0,490909

0,490909

MFLOPS

MP-MFLOPS: 2 операции

virtual

3

6,750000

5,400000

6,750000

MFLOPS

MP-MFLOPS: 8 операций

original

3

0,646707

0,646707

0,646707

MFLOPS

MP-MFLOPS: 8 операций

virtual

3

9,000000

9,000000

9,818182

MFLOPS

MP-MFLOPS: 32 операции

original

3

0,638109

0,638109

0,638109

MFLOPS

MP-MFLOPS: 32 операции

virtual

3

10,536585

10,536585

11,076923

MFLOPS

Для Whetstone геометрическое среднее результатов арифметических секций составило 0,389 MFLOPS в модели и 5,187 MFLOPS в ускоренном варианте. Это отдельный показатель, а не пересчёт MWIPS в другие единицы.

На диаграмме результаты разделены по семействам тестов:

Результаты бенчмарков эмулятора на хосте

Результаты бенчмарков эмулятора на хосте

Dhrystone

Ниже — пример вывода отдельного запуска порта на Фортране. Его результат, 0,571 DMIPS за 4,98 с. Полный листинг этого примера сохранён в приложении.

DHRYSTONE BENCHMARK 2.1 (FORTRAN-GDR FOR BESM-6)RUNNING   5000 PASSES...EXECUTION ENDSIGLOB:            5 (SHOULD BE 5)BLOB:           T (SHOULD BE TRUE)C1GLB:           65 (SHOULD BE 65 = A)C2GLB:           66 (SHOULD BE 66 = B)A1GLOB 8:         7 (SHOULD BE 7)A2GLOB 8/7:    5010 (SHOULD BE   5010)PGLB.DISCR:      0 (SHOULD BE 0)PGLB.ENUM:       2 (SHOULD BE 2)PGLB.INT:       17 (SHOULD BE 17)NEXTP.DISCR:        0 (SHOULD BE 0)NEXTP.ENUM:         1 (SHOULD BE 1)NEXTP.INT:         18 (SHOULD BE 18)I1LOC:            5 (SHOULD BE 5)I2LOC:           13 (SHOULD BE 13)I3LOC:            7 (SHOULD BE 7)ELOC:            1 (SHOULD BE 1)ALL 18 CONTROL VALUES MATCH THE DHRYSTONE 2.1 SPECGUEST CPU SECONDS:       4.9800GUEST DMIPS:     0.571438

Whetstone

Вывод нашего запуска:

ROY LONGBOTTOM WHETSTONE - BESM-6 FOREX8 PASSES USED (X 100); REAL IS 48 BITSLOOP CONTENT              RESULT                 MFLOPS       MOPS    SECONDSN1 FLOATING POINT        -1.13333352534209    0.808421                  0.1900N2 FLOATING POINT        -1.13333356774819    0.625116                  1.7200N3 IF THEN ELSE           1.00000000000000                0.258750      3.2000N4 FIXED POINT           11.99999999998908                0.652850      3.8600N5 SIN,COS ETC.           0.50000004814501                0.036733     18.1200N6 FLOATING POINT         0.99999778767669    0.116753                 36.9600N7 ASSIGNMENTS            3.00000000000000                0.080087     18.4600N8 EXP,SQRT ETC.          0.75792038854851                0.018213     16.3400BAD CONTROL VALUES=     0ALL 8 CONTROL VALUES MATCH: YESGUEST CPU SECONDS:      98.8500GUEST MWIPS:     0.809307GUEST MFLOPS GEOMEAN N1 N2 N6:     0.389304Halted by STOP at 0118 after 105244035 instructions

Для исторического сопоставления ниже сохранён результат Whetstone на Pentium 100 МГц. Сравнивать следует результаты бенчмарков, учитывая язык, транслятор и точность вычислений: абсолютные времена секций зависят ещё и от числа проходов. Материалы Роя Лонгботтома о Whetstone.

К примеру, Whetstone на Pentium 100 МГц
Loop content                 Result            MFLOPS     MOPS   SecondsN1 floating point    -1.12475025653839100      19.971              0.274N2 floating point    -1.12274754047393800      11.822              3.240N3 if then else       1.00000000000000000               11.659     2.530N4 fixed point       12.00000000000000000               13.962     6.430N5 sin,cos etc.       0.49904659390449520                2.097    11.310N6 floating point     0.99999988079071040       3.360             45.750N7 assignments        3.00000000000000000                2.415    21.810N8 exp,sqrt etc.      0.75110864639282230                1.206     8.790MWIPS                                          28.462            100.134

Для калибровки использован результат модели БЭСМ-6, опубликованный Leo B. в 2017 году. В строке Chipset/options прямо указана эмуляция конвейеров УУ и АУ.

Whetstone на модели БЭСМ-6, июль 2017 года
WHETSTONE BENCHMARK FOR  100.00 SECONDS DURATION      8 PASSES USED (X 100) FORTRAN WHETSTONE BENCHMARK - SINGLE PRECISIONMonth run         7/2017Supplier/model    IPMCE, USSR                                CPU chip type     BESM-6                               Clock MHz         9                                   Cache size        16 words                                 Chipset/options   CU/ALU pipes emulated using interlocks and ave. timings from the manual                        OS/DOS            DISPAK (user mode emulated)Compiler          F O R E X ИПM AH CCCP 4.12 OT 25.06.85           Options           default LOOP CONTENT                   RESULT                MFLOPS      MOPS   SECONDS N1 FLOATING POINT       -1.12398256285086973          0.524               0.293 N2 FLOATING POINT       -1.12187081181764370          0.402               2.674 N3 IF THEN ELSE          1.00000000000000000                    0.185     4.477 N4 FIXED POINT          12.00000000000000000                    0.346     7.280 N5 SIN,COS ETC.          0.49902906717352380                    0.036    18.361 N6 FLOATING POINT        0.99999958804255584          0.121              35.720 N7 ASSIGNMENTS           3.00000000000000000                    0.106    13.963 N8 EXP,SQRT ETC.         0.75100162294984329                    0.018    16.087 MWIPS                                                 0.809              98.856

Сводные MWIPS двух моделей близки, но секции некоторых различаются:

Время восьми секций Whetstone в публикации 2017 года и в Besm6.Net

Время восьми секций Whetstone в публикации 2017 года и в Besm6.Net

Обе серии относятся к моделям. Диаграмма показывает результат калибровки, а не измеренную ошибку относительно физической БЭСМ-6. Отличаются также программное окружение и контрольные численные значения.

Memspeed

Вывод первого подтеста — копирования из массива в массив:

MEMSPEED PART  1WORDS=  4096REPEAT PASSES=  1000BYTES/ELEMENT= 12DATA TRAFFIC BYTES=   49151999.999958206899FIRST RESULT=          0.000244140625LAST RESULT=          1.000000000000CHECKSUM=       2048.499999997147BAD ELEMENTS=     0ALL VALUES MATCH: YESGUEST CPU SECONDS:       8.6800GUEST MB/S:     5.662673Halted by STOP at 0118 after 24959421 instructions

MP-MFLOPS

Первый подтест выполняет две арифметические операции на элемент. Для 9000 элементов и 30 проходов это 540 000 операций. При гостевом времени 1,1 с получается 0,490909 MFLOPS, что соответствует строке сводной таблицы.

MP-MFLOPS PART  1WORDS=  9000OPS/WORD=  2REPEAT PASSES=    30FLOPS=     539999.999998690327FIRST RESULT=          0.999099623640BAD CONTROL VALUES=     0CALCULATIONS PERFORMEDALL SAME: YESGUEST CPU SECONDS:       1.1000GUEST MFLOPS:     0.490909Halted by STOP at 0118 after 6893148 instructions

Контрольные значения сошлись, программа завершилась инструкцией STOP. Небольшое отклонение напечатанного FLOPS от целого числа 540 000 связано с численным представлением в гостевой программе; для подсчёта операций используется выражение 9000 × 30 × 2.

При переходе от двух операций на элемент к восьми или 32 меняется доля служебной работы. Итоговый MFLOPS зависит и от команд, сгенерированных транслятором, и от зависимостей между ними.

Точность измерений

У самого короткого ядра MP-MFLOPS интервал в режиме virtual составил 0,08–0,10 с. Шаг таймера 20 мс сопоставим с четвертью этого времени: несколько десятичных знаков в выводе не означают соответствующей точности. У Memspeed разброс тоже заметен. Повторение модельного времени в original показывает детерминированность модели, но не её точность относительно исторической машины.

Выводы

В выбранной модели Dhrystone даёт около 0,653 DMIPS, Whetstone — 0,809 MWIPS, а арифметические ядра MP-MFLOPS — 0,491–0,647 MFLOPS. Эти числа отвечают на разные вопросы: универсального перевода между ними и паспортным «миллионом операций в секунду» нет.

Результат нужно читать вместе с указанием источника времени. Режим virtual показывает практическую скорость Besm6.Net на конкретном современном компьютере. Режим original позволяет сравнивать нагрузки внутри зафиксированной временной модели. Паспортное быстродействие описывает историческую машину в терминах своего источника. Для прямого сравнения нужна общая методика.

Правильный результат программы и независимый численный контроль помогают проверить арифметику. Для проверки времени нужны журналы запусков на физической машине с указанием ОС, транслятора, исходного текста и нагрузки либо подробные аппаратные измерения. Калибровочный Whetstone помогает настроить модель, но не заменяет этих данных.

Симулятор возвращает возможность экспериментировать с программами БЭСМ-6: читать листинг исторического Фортрана, менять представление данных и наблюдать влияние алгоритма. Его исходный код позволяет проследить, какие зависимости учитывает модель, что считается обращением к памяти и сколько времени назначено системной функции.

Следующий шаг — испытать модель на независимом историческом наборе программ, не участвовавшем в настройке коэффициентов. Особенно полезны задачи с разным соотношением арифметики, обращений к памяти и системных услуг. Пока такого сравнения нет, приведённые измерения характеризуют симулятор и его временную модель.

Ссылки

Книги и техническая документация

  1. Салтыков А. И., Макаренко Г. И. [Программирование на языке Фортран][fortran-book] / под ред. Н. Н. Говоруна. М.: Наука, 1976. 256 с. Серия «Библиотечка программиста». Основной источник по архитектуре, арифметике, системе «Дубна» и МАДЛЕНу. [][fortran-scan].

  2. Автокод БЭСМ-6. Инструкция. ИТМиВТ АН СССР, 1969. Форматы команд и чисел, ввод и отладка программ.

  3. Краткий перечень команд БЭСМ-6. Сопоставление машинных кодов, русских обозначений, мнемокодов БЕМШа и МАДЛЕНа.

  4. Электронные цифровые вычислительные машины общего назначения. Каталог, 1968.

  5. Техническая документация БЭСМ-6. Сканированные описания устройств, системы команд и пультов.

История машины и программного обеспечения

  1. БЭСМ-6 в Виртуальном компьютерном музее, история серии БЭСМ и описание архитектуры и ПО БЭСМ-6.

  2. НИИсчётмаш: историческая справка. Разработка устройств семейства АЦПУ-128 и ВУ-700.

  3. Материалы об операционной системе ДИСПАК и «Четыре поколения операционных систем», SORUCOM 2020.

  4. Control Data 6400/6600 Computing Systems’ Configurator. CDC, 1966. Отчёт Lax содержит историческую таблицу производительности систем NCAR.

Симуляторы, бенчмарки и результаты

  1. Besm6.Net — исходный код исследуемого симулятора; задания бенчмарков и таблица измерений.

  2. Dubna BESM-6 Emulator и SIMH; руководство по SIMH для БЭСМ-6.

  3. Dhrystone 2.1: материалы Netlib. Происхождение теста и нормировка относительно VAX-11/780.

  4. Коллекция бенчмарков Роя Лонгботтома. История и результаты Whetstone, Memspeed и MP-MFLOPS; ссылки на архивные материалы и исходные тексты.

  5. Leo B. How to compute performance of a CPU in FLOPS? Эксперимент с временной моделью БЭСМ-6, 2017. Источник калибровочного Whetstone.

Источники добавленных фотографий и условия лицензий, если они указаны владельцем, приведены непосредственно в подписях к изображениям.

Приложение: полный листинг запуска

Листинг компиляции и выполнения примера Dhrystone для Фортрана-ГДР. Машинный вывод сохранён без редакторских изменений; этот запуск отличается от серии измерений в основной таблице.

Полный листинг запуска задания с программой Dhrystone

«`txt 04 ИЮЛ 24 23.45 ЙOKCEЛ БЭCM-6/5 ШИФP-12 MOHИTOPHAЯ CИCTEMA ′Д Y Б H A′ — 20/10/88

        ЖЖЖ   Ж   Ж ЖЖЖЖ  Ж   Ж  ЖЖЖ  ЖЖЖЖЖ  ЖЖЖ  Ж   Ж ЖЖЖЖ        ЖЖЖ   Ж   Ж  ЖЖЖ  ЖЖЖЖ   ЖЖЖ        Ж  Ж  Ж   Ж Ж   Ж Ж   Ж Ж       Ж   Ж   Ж ЖЖ  Ж Ж           Ж  Ж  ЖЖ ЖЖ   Ж   Ж   Ж Ж        Ж   Ж ЖЖЖЖЖ Ж   Ж Ж   Ж  ЖЖЖ    Ж   Ж   Ж Ж Ж Ж ЖЖЖ         Ж   Ж Ж Ж Ж   Ж   Ж   Ж  ЖЖЖ        Ж   Ж Ж   Ж ЖЖЖЖ   Ж Ж      Ж   Ж   Ж   Ж Ж  ЖЖ Ж      ЖЖЖ  Ж   Ж Ж Ж Ж   Ж   Ж   Ж     Ж        Ж   Ж Ж   Ж Ж Ж     Ж       Ж   Ж   Ж   Ж Ж   Ж Ж           Ж   Ж Ж   Ж   Ж   ЖЖЖЖ      Ж        Ж   Ж Ж   Ж Ж  Ж    Ж   Ж   Ж   Ж   Ж   Ж Ж   Ж Ж           Ж   Ж Ж   Ж   Ж   Ж     Ж   Ж        ЖЖЖЖ  Ж   Ж Ж   Ж   Ж    ЖЖЖ    Ж    ЖЖЖ  Ж   Ж ЖЖЖЖЖ       ЖЖЖЖ  Ж   Ж  ЖЖЖ  Ж      ЖЖЖ
```txt*NAME DHRYSTONE-DMIPS*FTN                                                 04 ИЮЛ 24 23.45 Ф O P T P A H - Г Д P                                                                                 THE WAY OUT WAS      (09.07.81)                                                               C     RUNTIME TRACING (BESM6 RUN --TRACE): THE H  001               PROGRAM DHRY                                                                       OT ADDRESSES POINTED              C     ==========================================                 C     AT THE COMPARE LOOP, AND A PRINT OF THE LO                                      ========================                                         OP COUNTER SHOWED IT              C     DHRYSTONE 2.1 -- PORT TO BESM-6, FORTRAN-G                 C     PINNED AT ZERO.                                      DR DIALECT (*FTN)                        C              C                                                                C     METHODOLOGICAL NOTE: A WRONG-ANSWER-OR-HAN              C     GUEST DMIPS: THIS DECK USES THE CTIME CPU                                          G SYMPTOM IS NOT                                      TIMER, ENABLED BY                        C     EVIDENCE OF A COMPILER FAULT. INSTRUMENT F              C     --GUEST-CLOCK (JSON GUESTCLOCK=TRUE). RESO                                         IRST.                                      LUTION IS 0.02 SECONDS.                  C              C     DMIPS = PASSES / CPU SECONDS / 1757. THE S                 C     LANGUAGE NOTES (ESTABLISHED BY PROBES, SEE                                      IMULATED CLOCK HAS THE                                            REPORT):              C     SAME VALUE IN MAX AND ORIGINAL; VIRTUAL US                 C       * IDENTIFIERS ARE LIMITED TO 6 CHARACTER                                      ES HOST ELAPSED TIME.                                            S (ERROR 035)              C     SOURCE: BOOK/FORTRAN-1976/02-FORTRAN-DUBNA                 C       * BLOCK IF/THEN/ENDIF IS NOT SUPPORTED (                                      .MD, TIME ACCOUNTING.                                            ERROR 021);              C     THE ORIGINAL UNTIMED BENCHMARK REMAINS UNC                 C         ONLY SINGLE-STATEMENT IF ... GO TO WOR                                      HANGED FOR COMPARISONS.                                          KS              C                                                                C       * ARRAY ELEMENTS CANNOT BE USED AS PRINT              C     STATUS: WORKS. ALL 18 DHRYSTONE 2.1 CONTRO                                          ITEMS: AN ELEMENT                                      L VALUES MATCH THE                       C         PRINTS AS COMMAS. EVERY PRINTED ARRAY              C     SPECIFICATION AT NUMBER = 5000. SETTING NU                                         VALUE IS THEREFORE                                      MBER = 0 PRODUCES A                      C         COPIED TO A SCALAR TEMPORARY FIRST              C     ZERO-WORK BASELINE WITHOUT A DMIPS RATING.                 C       * ARRAYS CANNOT BE PASSED TO SUBPROGRAMS              C                                                                                        , AND COMMON INSIDE              C     THIS IS THE FORTRAN-GDR COUNTERPART OF THE                 C         A CALLED SUBPROGRAM FAILS TO ASSEMBLE,                                       PASCAL PORT                                                      SO ALL STATE LIVES              C       EXAMPLES/DHRYSTONE-BASELINE.DUB                          C         IN THIS SINGLE PROGRAM UNIT              C     ORIGINAL: R. WEICKER, CACM 27(10), 1984.                   C       * RECORDS, POINTERS AND ENUMERATIONS DO              C                                                                                        NOT EXIST IN FORTRAN,              C     HISTORY OF THIS FILE (KEPT BECAUSE IT IS I                 C         SO THEY ARE EMULATED: A RECORD IS A SE                                      NSTRUCTIVE)                                                      T OF PARALLEL INTEGER              C     ------------------------------------------                 C         ARRAYS INDEXED BY A NODE NUMBER, A POI                                      -----------                                                      NTER IS AN INTEGER              C     AN EARLIER REVISION OF THIS PORT LOOPED FO                 C         NODE INDEX, AN ENUMERATION IS AN INTEG                                      REVER FOR NUMBER >= 1                                            ER CONSTANT              C     AND THE FAULT WAS FIRST ATTRIBUTED TO THE                  C       * HOLLERITH CONSTANTS ARE REJECTED (ERRO                                      FORTRAN-GDR CODE                                                 R 123), SO STRINGS ARE              C     GENERATOR. THAT DIAGNOSIS WAS WRONG. THE R                 C         INTEGER ARRAYS FILLED WITH CHARACTER C                                      EAL CAUSE WAS THREE                                              ODES              C     SEPARATE DEFECTS IN THE PORT ITSELF, EACH                  C       * ONLY THE FIRST 3 NAMES OF A DECLARATIO                                      OF WHICH THE COMPILER                                            N ARE HONOURED, SO              C     ACCEPTED SILENTLY:                                         C         EVERY DECLARATION LISTS AT MOST 3 IDEN              C                                                                                        TIFIERS              C       1. IN THE STRING-COMPARE LOOP THE STATEM                 C       * FORMAT LABELS BELONG TO THE PROGRAM UN                                      ENT "C2 = 0" SAT ON                                              IT, SO ALL FORMATS              C          THE LOOP LABEL ITSELF, SO EVERY PASS                  C         ARE PLACED AFTER THE LAST STATEMENT AN                                      THROUGH "GO TO 55"                                               D BEFORE END              C          RE-INITIALISED THE COUNTER AND THE LO                 C     ------------------------------------------                                      OP NEVER TERMINATED.                                             ------------------------              C       2. PROC1 AND PROC3 HAD LOST THE CALLS TO                 C                                       PROC7, AND PROC2                        C     ---- ENUMERATIONS (IDENT1..IDENT5 = 0..4)              C          WROTE ITS RESULT TO A LOCAL INSTEAD O                                         ----                                      F BACK INTO ITS              002               INTEGER IDENT1, IDENT2, IDENT3              C          VAR PARAMETER INT1LOC.                    003               INTEGER IDENT4, IDENT5              C       3. THE PROC6 CALL IN PROC1 WAS BOUND TO      004               DATA IDENT1/0/, IDENT2/1/, IDENT3/2/                                      THE WRONG ENUM VALUE.        005               DATA IDENT4/3/, IDENT5/4/              C                                                    006               DATA T2( 1)/68/              C     BECAUSE EVERY ONE OF THESE IS A PLAIN LOGI     007               DATA T2( 2)/72/                                      C ERROR THAT HAPPENS         008               DATA T2( 3)/82/              C     TO EXPRESS ITSELF AS A NON-TERMINATING LOO     009               DATA T2( 4)/89/                                      P, THE SYMPTOM WAS           010               DATA T2( 5)/83/              C     INDISTINGUISHABLE FROM A COMPILER DEFECT.      011               DATA T2( 6)/84/  012               DATA T2( 7)/79/                                            C  013               DATA T2( 8)/78/                                            C     ---- GLOBAL SCALARS ----  014               DATA T2( 9)/69/                                071               INTEGER IGLOB  015               DATA T2(10)/80/                                072               LOGICAL BLOB  016               DATA T2(11)/32/                                073               INTEGER C1GLB, C2GLB  017               DATA T2(12)/80/                                074               DATA C1GLB/65/, C2GLB/66/  018               DATA T2(13)/82/                                075               DIMENSION A1GLOB(50)  019               DATA T2(14)/79/                                076               DIMENSION A2GLOB(2500)  020               DATA T2(15)/71/                                            C  021               DATA T2(16)/82/                                077               INTEGER RINDX, I1LOC, I2LOC  022               DATA T2(17)/65/                                078               INTEGER I3LOC, CHIDX, ELOC  023               DATA T2(18)/77/                                079               LOGICAL F2RES, BLOC  024               DATA T2(19)/32/                                080               INTEGER NBAD, F1RES  025               DATA T2(20)/50/                                081               REAL CT0, RT0, CT1  026               DATA T2(21)/78/                                082               REAL RT1, SECS, DMIPS  027               DATA T2(22)/68/                                083               DIMENSION SA1(30), SA2(30)  028               DATA T2(23)/32/                                084               DIMENSION T2(30), T3(30)  029               DATA T2(24)/83/                                            C  030               DATA T2(25)/84/                                            C     ---- WORKING STATE FOR THE INLINED PROCEDU  031               DATA T2(26)/82/                                                                    RES ----  032               DATA T2(27)/73/                                085               INTEGER INTLOC, ELOC2, IINDX  033               DATA T2(28)/78/                                086               INTEGER CHLOC, CH1LOC, CH2LOC  034               DATA T2(29)/71/                                087               INTEGER CH2PAR  035               DATA T3( 1)/68/                                088               INTEGER CIDX, CMPV, IPREF  036               DATA T3( 2)/72/                                089               INTEGER LIM, I, C1, C2  037               DATA T3( 3)/82/                                090               INTEGER IPV1, IPV2, PPREF  038               DATA T3( 4)/89/                                091               INTEGER NREC, EVPAR, EREFP  039               DATA T3( 5)/83/                                            C  040               DATA T3( 6)/84/                                            C     ---- STRING CONSTANTS AS CHARACTER CODES -  041               DATA T3( 7)/79/                                                                    ---  042               DATA T3( 8)/78/                                            C     PTRGLOB.STRCOMP := ′DHRYSTONE PROGRAM, SOM  043               DATA T3( 9)/69/                                                                    E STRING′  044               DATA T3(10)/80/                                092               DATA RSTRC(1, 1)/68/, RSTRC(1, 2)/72/, RST  045               DATA T3(11)/32/                                                                    RC(1, 3)/82/  046               DATA T3(12)/80/                                093               DATA RSTRC(1, 4)/89/, RSTRC(1, 5)/83/, RST  047               DATA T3(13)/82/                                                                    RC(1, 6)/84/  048               DATA T3(14)/79/                                094               DATA RSTRC(1, 7)/79/, RSTRC(1, 8)/78/, RST  049               DATA T3(15)/71/                                                                    RC(1, 9)/69/  050               DATA T3(16)/82/                                095               DATA RSTRC(1,10)/80/, RSTRC(1,11)/32/, RST  051               DATA T3(17)/65/                                                                    RC(1,12)/80/  052               DATA T3(18)/77/                                096               DATA RSTRC(1,13)/82/, RSTRC(1,14)/79/, RST  053               DATA T3(19)/32/                                                                    RC(1,15)/71/  054               DATA T3(20)/51/                                097               DATA RSTRC(1,16)/82/, RSTRC(1,17)/65/, RST  055               DATA T3(21)/82/                                                                    RC(1,18)/77/  056               DATA T3(22)/68/                                            C     STR1LOC := ′DHRYSTONE PROGRAM, 1ST STRING′  057               DATA T3(23)/32/                                098               DATA SA1( 1)/68/, SA1( 2)/72/, SA1( 3)/82/  058               DATA T3(24)/83/                                099               DATA SA1( 4)/89/, SA1( 5)/83/, SA1( 6)/84/  059               DATA T3(25)/84/                                100               DATA SA1( 7)/79/, SA1( 8)/78/, SA1( 9)/69/  060               DATA T3(26)/82/                                101               DATA SA1(10)/80/, SA1(11)/32/, SA1(12)/80/  061               DATA T3(27)/73/                                102               DATA SA1(13)/82/, SA1(14)/79/, SA1(15)/71/  062               DATA T3(28)/78/                                103               DATA SA1(16)/82/, SA1(17)/65/, SA1(18)/77/  063               DATA T3(29)/71/                                104               DATA SA1(19)/32/, SA1(20)/49/, SA1(21)/83/              C                                                    105               DATA SA1(22)/84/, SA1(23)/32/, SA1(24)/83/              C     ---- NUMBER OF RUNS ----                       106               DATA SA1(25)/84/, SA1(26)/82/, SA1(27)/73/  064               INTEGER NUMBER                                 107               DATA SA1(28)/78/, SA1(29)/71/  065               DATA NUMBER/5000/                                          C              C                                                    108               PRINT 900              C     ---- RECORD EMULATION ----                     109               PRINT 910, NUMBER              C     PTRGLOB AND NEXTPTRGLOB ARE NODE INDICES 1                 C                                       AND 2; THE FIELD                        C     ---- INITIALISE PTRGLOB ----              C     ARRAYS ARE PARALLEL TO THE NODE INDEX.         110               RPTRC(1) = NPTG  066               INTEGER PGLB, NPTG                             111               RDISC(1) = IDENT1  067               DATA PGLB/1/, NPTG/2/                          112               RENUM(1) = IDENT3  068               DIMENSION RPTRC(3), RDISC(3), RENUM(3)         113               RINTC(1) = 40  069               DIMENSION RINTC(3)                             114               I = 1  070               DIMENSION RSTRC(3,30)                          115           200 IF (I .GT. 30) GO TO 201  116                 RSTRC(1,I) = 32                              151               CH1LOC = CIDX  117                 I = I + 1                                    152               CH2LOC = CH1LOC  118                 GO TO 200                                    153               CH2PAR = SA2(INTLOC+1)  119           201 CONTINUE                                       154               F1RES = IDENT1  120               I = 1                                          155               IF (CH2LOC .NE. CH2PAR) GO TO 41  121           190 IF (I .GT. 2500) GO TO 191                     156               C1GLB = CH1LOC  122                 A2GLOB(I) = 0                                157               F1RES = IDENT2  123                 I = I + 1                                    158            41 IF (F1RES .EQ. IDENT1) GO TO 42  124                 GO TO 190                                    159               GO TO 40  125           191 CONTINUE                                       160            42 CHLOC = 65  126               A2GLOB(308) = 10                               161               INTLOC = INTLOC + 1              C                                                    162               GO TO 40              C     ---- MAIN LOOP ----                            163            43 IF (CHLOC .LT. 87) GO TO 45              C                                                    164               IF (CHLOC .GE. 90) GO TO 45              C     ==========================================     165               INTLOC = 7                                      ========================     166            45 IF (CHLOC .EQ. 82) GO TO 50              C     THE BENCHMARK BODY IS FULLY INLINED. FORTR     167               CMPV = 0                                      AN-GDR IS UNRELIABLE         168               C2 = 0              C     WHEN A SUBROUTINE DECLARES MANY NAMES, SO      169               GO TO 55                                      EVERY PROCEDURE BELOW        170            50 F2RES = .TRUE.              C     IS WRITTEN AS STRAIGHT-LINE CODE INSIDE TH     171               GO TO 58                                      E MAIN LOOP.                             C              C     ==========================================                 C     ---- COMPARE STR1LOC / STR2LOC LEXICOGRAPH                                      ========================                                         ICALLY ----              C     CTIME CPU SECONDS BRACKET ONLY THE BENCHMA                 C     NB: THE C2 = 0 INITIALISATION MUST SIT BEF                                      RK BODY. RUN THIS DECK                                           ORE THE LOOP HEAD.              C     WITH --GUEST-CLOCK; DATE* AND HOST PACING                  C     PLACING IT AT LABEL 55 (INSIDE THE LOOP) M                                      DO NOT AFFECT ITS SCORE.                                         ADE GO TO 55 RESET THE  127               CALL CTIME(CT0,RT0)                                        C     COUNTER ON EVERY PASS, SO THE LOOP NEVER T  128               DO 100 RINDX = 1, NUMBER                                                           ERMINATED.              C                                                    172            55 IF (C2 .GE. 30) GO TO 58              C     ---- PROC5 ----                                173               C1 = SA1(C2+1)  129               C1GLB = 65                                     174               IF (C1 .LT. SA2(C2+1)) CMPV = -1  130               BLOB = .FALSE.                                 175               IF (C1 .GT. SA2(C2+1)) CMPV = 1              C                                                    176               IF (CMPV .NE. 0) GO TO 58              C     ---- PROC4: BOOLGLOB := BOOLGLOB OR (CH1GL     177               C2 = C2 + 1                                      OB = ′A′) ----               178               GO TO 55  131               BLOC = .FALSE.                                             C  132               IF (C1GLB .EQ. 65) GO TO 30                                C     PASCAL: IF STR1LOC > STR2LOC THEN (INTLOC  133               GO TO 32                                                                           += 7; TRUE) ELSE FALSE  134            30 BLOC = .TRUE.                                  179               IF (CMPV .GT. 0) GO TO 56  135            32 IF (BLOC) GO TO 33                             180               GO TO 58  136               GO TO 34                                       181            56 INTLOC = INTLOC + 7  137            33 BLOB = .TRUE.                                  182               F2RES = .TRUE.  138            34 C2GLB = 66                                     183               GO TO 58              C                                                    184            58 F2RES = .FALSE.  139               I1LOC = 2                                                  C  140               I2LOC = 3                                      185               IF (F2RES) GO TO 141  141               ELOC = IDENT2                                  186               GO TO 142              C                                                    187           141 BLOB = .FALSE.              C     ---- STR2LOC := ′DHRYSTONE PROGRAM, 2ND ST     188               GO TO 142                                      RING′ ----                   189           142 BLOB = .TRUE.  142               I = 1                                                      C  143           660 IF (I .GT. 29) GO TO 661                                   C     ---- WHILE INT1LOC < INT2LOC DO ... ----  144                 SA2(I) = T2(I)                               190            60 IF (I1LOC .LT. I2LOC) GO TO 61  145                 I = I + 1                                    191               GO TO 70  146                 GO TO 660                                    192            61 I3LOC = 5 * I1LOC - I2LOC  147           661 CONTINUE                                       193               INTLOC = I1LOC + 2              C                                                    194               IPV1 = I1LOC              C     ---- FUNC2: BOOLGLOB := NOT FUNC2(STR1LOC,     195               IPV2 = I2LOC                                       STR2LOC) ----               196               IPREF = IPV2 + INTLOC  148               INTLOC = 2                                     197               I3LOC = IPREF  149            40 IF (INTLOC .GT. 2) GO TO 43                    198               I1LOC = I1LOC + 1              C     FUNC1(STR1LOC[INTLOC], STR2LOC[INTLOC+1]):     199               GO TO 60                                       COMPARE WITH ′C′            200            70 CONTINUE  150               CIDX = SA1(INTLOC)                                         C              C     ---- PROC8 ----                                248               GO TO 88  201               IPV1 = I1LOC                                   249            82 EREFP = IDENT1  202               IPV2 = I3LOC                                   250               ELOC = EREFP  203               INTLOC = IPV1 + 5                                          C     ---- STR2LOC := ′DHRYSTONE PROGRAM, 3RD ST  204               A1GLOB(INTLOC) = IPV2                                                              RING′ ----  205               A1GLOB(INTLOC+1) = A1GLOB(INTLOC)              251               I = 1  206               A1GLOB(INTLOC+30) = INTLOC                     252           770 IF (I .GT. 29) GO TO 771  207               IINDX = INTLOC                                 253                 SA2(I) = T3(I)  208               IINDX = INTLOC + 1                             254                 I = I + 1  209               IINDX = INTLOC                                 255                 GO TO 770  210           180 IF (IINDX .GT. INTLOC+1) GO TO 181             256           771 CONTINUE  211                 A2GLOB(INTLOC + 50*(IINDX-1)) = INTLOC       257               I2LOC = RINDX  212                 IINDX = IINDX + 1                            258               IGLOB = RINDX  213                 GO TO 180                                    259            88 CHIDX = CHIDX + 1  214           181 CONTINUE                                       260               GO TO 80  215               A2GLOB(INTLOC + 50*(INTLOC-2)) =               261            90 CONTINUE                   + A2GLOB(INTLOC + 50*(INTLOC-2)) + 1                        C  216               A2GLOB(INTLOC+20 + 50*(INTLOC-1)) = A1GLOB                 C     ---- TAIL ARITHMETIC ----                                      (INTLOC)                     262               I2LOC = I2LOC * I1LOC  217               IGLOB = 5                                      263               I1LOC = I2LOC / I3LOC              C                                                    264               I2LOC = 7 * (I2LOC - I3LOC) - I1LOC              C     ---- PROC1(PTRGLOB) ----                                   C  218               NREC = RPTRC(PGLB)                                         C     ---- PROC2(VAR INT1LOC) ----  219               RPTRC(PGLB) = RPTRC(NPTG)                                  C     INTPARREF IS A VAR PARAMETER IN THE ORIGIN  220               RINTC(PGLB) = 5                                                                    AL, SO THE ASSIGNMENT  221               RINTC(NREC) = RINTC(PGLB)                                  C     BELOW WRITES BACK INTO INT1LOC ITSELF.  222               RPTRC(NREC) = RPTRC(PGLB)                      265               INTLOC = I1LOC + 10              C     ---- PROC3: PROC7(10, INTGLOB, PTRGLOB.INT     266               ELOC2 = IDENT5                                      COMP) ----                   267           150 IF (C1GLB .EQ. 65) GO TO 151  223               PPREF = RPTRC(PGLB)                            268               GO TO 152  224               INTLOC = 10 + 2                                269           151 INTLOC = INTLOC - 1  225               IPV1 = 10                                      270               I1LOC = INTLOC - IGLOB  226               IPV2 = IGLOB                                   271               ELOC2 = IDENT1  227               RINTC(PGLB) = IPV2 + INTLOC                    272           152 IF (ELOC2 .EQ. IDENT1) GO TO 155              C                                                    273               GO TO 150  228               IF (RDISC(NREC) .EQ. IDENT1) GO TO 72          274           155 CONTINUE  229               GO TO 75                                       275           100 CONTINUE  230            72 RINTC(NREC) = 6                                276               CALL CTIME(CT1,RT1)              C     ---- PROC6(PTRGLOB.ENUMCOMP, NEXTPTR.ENUMC     277               SECS = RT1-RT0                                      OMP) ----                    278               DMIPS = 0.              C     PTRGLOB.ENUMCOMP IS IDENT3, SO THE CASE BR     279               IF (SECS .LE. 0.) GO TO 1400                                      ANCH "IDENT3" FIRES          280               DMIPS = FLOAT(NUMBER)/(1757.*SECS)              C     AND ENUMCOMP BECOMES IDENT2.                   281          1400 CONTINUE  231               EREFP = IDENT2                                             C  232               RENUM(NREC) = EREFP                                        C     ==========================================              C     ---- PROC7(NEXTPTR.INTCOMP, 10, NEXTPTR.IN                                         ========================                                      TCOMP) ----                              C     ---- REPORT ----  233               INTLOC = RINTC(NREC) + 2                       282               PRINT 920  234               RINTC(NREC) = 10 + INTLOC                      283               PRINT 930              C     ---- NEXTPTR.PTRCOMP := PTRGLOB.PTRCOMP --     284               NBAD = 0                                      --                           285               LIM = NUMBER + 10  235               RPTRC(NREC) = RPTRC(PGLB)                                  C  236               GO TO 75                                                   C     ARRAY ELEMENTS CANNOT BE PRINT ITEMS, SO E  237            75 CONTINUE                                                                           VERY VALUE IS FIRST              C                                                                C     COPIED INTO A SCALAR TEMPORARY (IPREF).              C     ---- FOR CHINDEX := ′A′ TO CH2GLOB ----        286               IPREF = IGLOB  238               CHIDX = 65                                     287               IF (IPREF .NE. 5) NBAD = NBAD + 1  239            80 IF (CHIDX .GT. C2GLB) GO TO 90                 288               PRINT 940, IPREF  240               CH1LOC = CHIDX                                 289               IF (.NOT. BLOB) NBAD = NBAD + 1  241               CH2LOC = CH1LOC                                290               PRINT 950, BLOB  242               CH2PAR = 67                                    291               IPREF = C1GLB  243               F1RES = IDENT1                                 292               IF (IPREF .NE. 65) NBAD = NBAD + 1  244               IF (CH2LOC .NE. CH2PAR) GO TO 81               293               PRINT 960, IPREF  245               C1GLB = CH1LOC                                 294               IPREF = C2GLB  246               F1RES = IDENT2                                 295               IF (IPREF .NE. 66) NBAD = NBAD + 1  247            81 IF (ELOC .EQ. F1RES) GO TO 82                  296               PRINT 970, IPREF  297               IPREF = A1GLOB(8)                                                                  HIS PROGRAM UNIT) ----  298               IF (IPREF .NE. 7) NBAD = NBAD + 1              355           900 FORMAT (′DHRYSTONE BENCHMARK 2.1 (FORTRAN-  299               PRINT 980, IPREF                                                                   GDR FOR BESM-6)′)  300               IPREF = A2GLOB(308)                            356           910 FORMAT (′RUNNING ′, I6, ′ PASSES...′)  301               IF (IPREF .NE. LIM) NBAD = NBAD + 1            357           920 FORMAT (′ ′)  302               PRINT 990, IPREF, LIM                          358           930 FORMAT (′EXECUTION ENDS′)  303               IPREF = RDISC(PGLB)                            359           940 FORMAT (′IGLOB:       ′, I6, ′ (SHOULD BE  304               IF (IPREF .NE. 0) NBAD = NBAD + 1                                                  5)′)  305               PRINT 1000, IPREF                              360           950 FORMAT (′BLOB:      ′, L6, ′ (SHOULD BE TR  306               IPREF = RENUM(PGLB)                                                                UE)′)  307               IF (IPREF .NE. 2) NBAD = NBAD + 1              361           960 FORMAT (′C1GLB:       ′, I6, ′ (SHOULD BE  308               PRINT 1010, IPREF                                                                  65 = A)′)  309               IPREF = RINTC(PGLB)                            362           970 FORMAT (′C2GLB:       ′, I6, ′ (SHOULD BE  310               IF (IPREF .NE. 17) NBAD = NBAD + 1                                                 66 = B)′)  311               PRINT 1020, IPREF                              363           980 FORMAT (′A1GLOB 8:    ′, I6, ′ (SHOULD BE  312               IPREF = RDISC(NPTG)                                                                7)′)  313               IF (IPREF .NE. 0) NBAD = NBAD + 1              364           990 FORMAT (′A2GLOB 8/7:  ′, I6, ′ (SHOULD BE  314               PRINT 1030, IPREF                                                                  ′, I6, ′)′)  315               IPREF = RENUM(NPTG)                            365          1000 FORMAT (′PGLB.DISCR: ′, I6, ′ (SHOULD BE 0  316               IF (IPREF .NE. 1) NBAD = NBAD + 1                                                  )′)  317               PRINT 1040, IPREF                              366          1010 FORMAT (′PGLB.ENUM:  ′, I6, ′ (SHOULD BE 2  318               IPREF = RINTC(NPTG)                                                                )′)  319               IF (IPREF .NE. 18) NBAD = NBAD + 1             367          1020 FORMAT (′PGLB.INT:   ′, I6, ′ (SHOULD BE 1  320               PRINT 1050, IPREF                                                                  7)′)  321               IPREF = I1LOC                                  368          1030 FORMAT (′NEXTP.DISCR:   ′, I6, ′ (SHOULD B  322               IF (IPREF .NE. 5) NBAD = NBAD + 1                                                  E 0)′)  323               PRINT 1060, IPREF                              369          1040 FORMAT (′NEXTP.ENUM:    ′, I6, ′ (SHOULD B  324               IPREF = I2LOC                                                                      E 1)′)  325               IF (IPREF .NE. 13) NBAD = NBAD + 1             370          1050 FORMAT (′NEXTP.INT:     ′, I6, ′ (SHOULD B  326               PRINT 1070, IPREF                                                                  E 18)′)  327               IPREF = I3LOC                                  371          1060 FORMAT (′I1LOC:       ′, I6, ′ (SHOULD BE  328               IF (IPREF .NE. 7) NBAD = NBAD + 1                                                  5)′)  329               PRINT 1080, IPREF                              372          1070 FORMAT (′I2LOC:       ′, I6, ′ (SHOULD BE  330               IPREF = ELOC                                                                       13)′)  331               IF (IPREF .NE. 1) NBAD = NBAD + 1              373          1080 FORMAT (′I3LOC:       ′, I6, ′ (SHOULD BE  332               PRINT 1090, IPREF                                                                  7)′)              C                                                    374          1090 FORMAT (′ELOC:       ′, I6, ′ (SHOULD BE 1              C     ---- PTRGLOB.STRCOMP, ONE CHARACTER PER LI                                         )′)                                      NE ----                      375          1110 FORMAT (′PGLB.STR:  ′, A1)  333               I = 1                                          376          1200 FORMAT (′ALL 18 CONTROL VALUES MATCH THE D  334          1300 IF (I .GT. 30) GO TO 1301                                                          HRYSTONE 2.1 SPEC′)  335                 CHLOC = RSTRC(PGLB,I)                        377          1210 FORMAT (′MISMATCHES: ′, I6, ′ - PORT FAILE  336                 IF (CHLOC .NE. 32) PRINT 1110, CHLOC                                             D VERIFICATION′)  337                 I = I + 1                                    378          1220 FORMAT (′GUEST CPU SECONDS: ′, F12.4)  338                 GO TO 1300                                   379          1230 FORMAT (′GUEST DMIPS: ′, F12.6)  339          1301 CONTINUE                                       380          1240 FORMAT (′DMIPS UNAVAILABLE: ENABLE --GUEST              C                                                                                        -CLOCK OR RUN LONGER′)  340               IF (NBAD .EQ. 0) PRINT 1200                    381          1250 FORMAT (′DMIPS UNAVAILABLE: CONTROL VALUES  341               IF (NBAD .NE. 0) PRINT 1210, NBAD                                                   DO NOT MATCH′)  342               IF (NUMBER .LE. 0) GO TO 1403                  382          1260 FORMAT (′DMIPS UNAVAILABLE: ZERO PASSES′)  343               IF (NBAD .NE. 0) GO TO 1402                    383               END  344               IF (SECS .LT. 0.04) GO TO 1401  345               PRINT 1220, SECS  346               PRINT 1230, DMIPS                                      BESM FORTRAN DIAGNOSTIC RESULTS  347               GO TO 1404  348          1401 PRINT 1240                                             ERRORS: 0     WARNINGS: 1  349               GO TO 1404  350          1402 PRINT 1250                                    WARN 001 IN 00179 THERE IS NO PATH TO THIS STATEMENT  351               GO TO 1404  352          1403 PRINT 1260  353          1404 CONTINUE                                       STATEMENT    RELATIVE ADDRESSES OF STATEMENTS (OCTAL)  354               STOP              C                                                     00001        :00000   00000   00000   00000   00000              C     ==========================================      00006         00000   00000   00000   00000   00000                                      ========================      00011         00000   00000   00000   00000   00000              C     ---- FORMAT STATEMENTS (MUST LIVE INSIDE T      00016         00000   00000   00000   00000   00000   00021         00000   00000   00000   00000   00000              00351         01011  :01012  :01016  :01016  :01017   00026         00000   00000   00000   00000   00000              00356        :01017  :01017  :01017  :01017  :01017   00031         00000   00000   00000   00000   00000              00361        :01017  :01017  :01017  :01017  :01017   00036         00000   00000   00000   00000   00000              00366        :01017  :01017  :01017  :01017  :01017   00041         00000   00000   00000   00000   00000              00371        :01017  :01017  :01017  :01017  :01017   00046         00000   00000   00000   00000   00000              00376        :01017  :01017  :01017  :01017  :01017   00051         00000   00000   00000   00000   00000              00381        :01017  :01017  :01017   00056         00000   00000   00000   00000   00000   00061         00000   00000   00000   00000   00000                *** EXTERNALS ***   00066         00000   00000   00000   00000   00000   00071         00000   00000   00000   00000   00000               CTIME   00076         00000   00000   00000   00000   00000   00081         00000   00000   00000   00000   00000                *** ENTRIES ***   >LOCATION<   00086         00000   00000   00000   00000   00000   00091         00000   00000   00000   00000   00000               DHRY    >00000<   PROGRA  >00000<   00096         00000   00000   00000   00000   00000   00101         00000   00000   00000   00000   00000                *** UNREFERENCED IDENTIFIERS OR UNDEFINED ARRAYS ***   00106         00000   00000   00000  :00004  :00011   00111         00012  :00014   00015   00016  :00020               EVPAR   00116         00021  :00026   00030  :00031  :00031   00121        :00032   00033  :00036   00040  :00041            >> DHRY   <<    LENGTH: 03565 06755B   INPUT CARDS: 00531   00126        :00041  :00042  :00045   00050   00051   00131         00052  :00053   00054  :00055  :00056   00136        :00057  :00060  :00061  :00062  :00063   00141        :00064  :00065  :00066   00067   00072   00146        :00075  :00076  :00076  :00077   00100   00151         00103   00104   00105   00110   00111   00156        :00113  :00114  :00115   00116  :00117   00161        :00120   00122  :00123   00124  :00126   00166        :00127   00130   00131  :00132  :00133   00171        :00134  :00135   00136   00141  :00146   00176        :00152   00153  :00156   00156  :00160   00181        :00161   00163   00164  :00165  :00166   00186         00166  :00167  :00170  :00170  :00171   00191         00172  :00173   00176  :00201  :00202   00196        :00203  :00205   00205  :00210  :00211   00201        :00211  :00212  :00213   00215   00220   00206         00221   00223   00224  :00227  :00230   00211        :00233   00240  :00243  :00244  :00244   00216        :00252  :00255  :00256   00261   00265   00221        :00267  :00272  :00274   00275   00276   00226         00277   00300   00303  :00307  :00310   00231         00312   00313   00316   00321   00324   00236         00327  :00330  :00330  :00331   00332   00241         00333  :00334  :00335  :00336   00337   00246         00340  :00342   00343  :00344  :00345   00251         00345  :00347   00350   00353  :00356   00256        :00357  :00357  :00360  :00361   00363   00261        :00364  :00364  :00367   00373   00400   00266        :00403  :00404   00405  :00406   00410   00271         00412  :00414   00415  :00416  :00416   00276        :00417  :00422   00423   00424  :00426   00281        :00432  :00432  :00436  :00442  :00443   00286         00445   00446  :00452  :00457  :00463   00291        :00470  :00471  :00475  :00502  :00503   00296        :00507  :00514   00515  :00521  :00526   00301         00527  :00533  :00541   00544  :00551   00306        :00556   00561  :00566  :00573   00576   00311        :00603  :00610   00613  :00620  :00625   00316         00630  :00635  :00642   00645  :00652   00321        :00657  :00660  :00664  :00671  :00672   00326        :00676  :00703  :00704  :00710  :00715   00331        :00716  :00722  :00727  :00730   00731   00336         00737  :00746   00750  :00751  :00751   00341        :00756  :00764   00765  :00767   00770   00346        :00775   01001  :01002   01005  :01006*EXECUTE      *LIBRA:21 = CTIME≠         DHRY       01000                FT*722   E 10624                ITIME    E 11636                ISOTCOSY   12752         PROGRAM  E 01000                FT*642   E 10624                LOCF     E 11641                ISOTCOS1 E 13023         BCDWRIT*   07755                FT*002   E 10624                XLOC     E 11641                FMRTAPE    13043         FT*621   E 07755                FD*642   E 10625                R*TO*INT   11645                OCTTDEC    13772         BCDENC*  E 07761                FD*722   E 10625                R*TO*I   E 11646                LUNMUN   C 14025         FT*611   E 07761                FC*722   E 10625                STOP*      11660                JERRIO*  C 14026         FT*571   E 07763                FC*642   E 10625                EXIT     E 11661                CARD2    C 14027         FT*561   E 07766                FC*002   E 10625                BCDBEG*    11707                ISOICTTR   14054         NEXTLET* E 07773                IOEND*   E 10632                FT2*     E 12214                REVCARD    14111         RK*      E 10035                FT*643   E 10632                KONV1*   E 12227                *ICHECK* C 14136         WSY*     E 10273                FT*723   E 10632                PRINT8     12323                *ПEPФOPA   14144         I/O*ERR  E 10533                FT*003   E 10632                TTPRINT    12504                KOД*CDC  E 14145         IOCONT*    10560                CTIME      11620                BCDPUN     12543                CBOБOДHO   14205         IOAC*    E 10611                PTIME    E 11635                EBCDPUN  E 12567≠DHRYSTONE BENCHMARK 2.1 (FORTRAN-GDR FOR BESM-6)RUNNING   5000 PASSES...EXECUTION ENDSIGLOB:            5 (SHOULD BE 5)BLOB:           T (SHOULD BE TRUE)C1GLB:           65 (SHOULD BE 65 = A)C2GLB:           66 (SHOULD BE 66 = B)A1GLOB 8:         7 (SHOULD BE 7)A2GLOB 8/7:    5010 (SHOULD BE   5010)PGLB.DISCR:      0 (SHOULD BE 0)PGLB.ENUM:       2 (SHOULD BE 2)PGLB.INT:       17 (SHOULD BE 17)NEXTP.DISCR:        0 (SHOULD BE 0)NEXTP.ENUM:         1 (SHOULD BE 1)NEXTP.INT:         18 (SHOULD BE 18)I1LOC:            5 (SHOULD BE 5)I2LOC:           13 (SHOULD BE 13)I3LOC:            7 (SHOULD BE 7)ELOC:            1 (SHOULD BE 1)ALL 18 CONTROL VALUES MATCH THE DHRYSTONE 2.1 SPECGUEST CPU SECONDS:       4.9800GUEST DMIPS:     0.571438Halted by STOP at 0118 after 17292960 instructions

[fortran-book]: Салтыков А. И., Макаренко Г. И. [Программирование на языке Фортран][fortran-book] / под ред. Н. Н. Говоруна. М.: Наука, 1976. 256 с. Серия «Библиотечка программиста» [fortran-scan]: Салтыков А. И., Макаренко Г. И. [Программирование на языке Фортран][fortran-book] / под ред. Н. Н. Говоруна. М.: Наука, 1976. 256 с. Серия «Библиотечка программиста»

ссылка на оригинал статьи https://habr.com/ru/articles/1094762/