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

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

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

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

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

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

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

Отладка типового элемента замены.
Система прерываний связывала вычисления с внешними событиями. Защита памяти и привилегированный режим давали диспетчеру возможность управлять несколькими задачами. Пользовательская программа не должна была самостоятельно распоряжаться всеми устройствами: она обращалась за обслуживанием к системному ПО.
Сравнение с аналогами
БЭСМ-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 мог отличаться.
Устройство | Назначение | Что важно для программы |
|---|---|---|
Ввод исходного текста и данных | Обычно 80 колонок на карте; перестановка карт меняла задание | |
Печать листинга и результатов | 128 печатных позиций; скорость зависит от исполнения устройства | |
Телетайп | Команды и сообщения оператору, работа с текстом | Медленный последовательный обмен; не измеритель скорости процессора |
НМЛ, магнитная лента | Библиотеки, программы, массивы данных | Учебник описывает до 32 магнитофонов; обмен зонами по 1К слов |
НМБ, магнитный барабан | Внешняя память с адресуемыми блоками | Учебник указывает до 512К слов суммарной барабанной памяти; блок 1К или 256 слов |
НМД, магнитный диск | Внешняя память более поздних конфигураций | В описанной комплектации блок 1К слов соответствует двум дорожкам; скорость зависит от накопителя |
Устройства и объёмы внешней памяти перечислены в [§ 1 учебника][fortran-book]. Для АЦПУ-128-2 НИИсчётмаш указывает 128 печатных позиций в строке и скорость 380–440 строк/мин. В той же исторической справке института описано устройство ввода ВУ-700-2.
Печать, внешняя память и ввод

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

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

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

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

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

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

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

Регистр | Размер | Назначение |
|---|---|---|
A, сумматор | 48 бит | Основной регистр для арифметических и логических операций |
Y, регистр младших разрядов (РМР) | 48 бит | Младшие разряды результата и данные для операций сдвига |
K, счётчик команд (СчАК) | 15 бит | Адрес слова с выполняемой командой; половина слова учитывается отдельно |
R, регистр режима и блокировок | 6 бит | Режим арифметики и признаки группы операций |
C, регистр изменения команд | 15 бит | Модификация исполнительного адреса после |
Регистр R содержит шесть признаков. Здесь разряды пронумерованы справа налево, начиная с единицы, как в учебнике:
Разряд | Назначение |
|---|---|
1 | Блокировка нормализации |
2 | Блокировка округления |
3 | Признак логической группы |
4 | Признак группы умножения |
5 | Признак группы сложения |
6 | Блокировка прерывания по переполнению |
Индексные регистры. В командах БЭСМ-6 предусмотрены 16 номеров индексных регистров — M₀–M₁₅. Каждый имеет разрядность 15 бит; нулевой номер соответствует нулевому значению. Содержимое индексного регистра можно передать в 15 младших разрядов сумматора и обратно. Индексные регистры используются для:
модификации адреса — содержимое регистра добавляется к адресной части команды;
организации циклов — регистр хранит счётчик;
временного хранения адресов и служебной информации.
Роли конкретных индексных регистров:
M₀ всегда даёт нулевое значение;
M₁–M₁₄ используются для обычной индексации;
M₁₅ (М017 в восьмеричной записи) служит указателем стека, или «магазина». Для соответствующих команд его использование включает магазинную адресацию с автоматическим увеличением или уменьшением указателя.
В документации индексные регистры часто нумеруются в восьмеричном виде от М000 до М017.
48-разрядное машинное слово
48-разрядное машинное слово — естественная единица хранения и адресации в БЭСМ-6. В нём помещаются две команды по 24 бита или одно число.

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

Часть машинного слова | Разряды |
|---|---|
Левая команда | 48–25 |
Правая команда | 24–1 |
Числа с плавающей запятой. Если слово содержит число, его разряды распределяются следующим образом:
Поле числа | Разряды |
|---|---|
Знак порядка | 48 |
Порядок | 47–42 |
Знак мантиссы | 41 |
Мантисса | 40–1 |

Положительная мантисса записывается в прямом коде, отрицательная — в дополнительном. Порядок хранится со смещением 64: семи старшим разрядам соответствует значение , где
лежит в диапазоне от
до
. В восьмеричной записи смещение 64 обозначается как
100B.
Значение числа равно . Положительная нормализованная мантисса лежит в диапазоне от
до
; модуль отрицательной нормализованной мантиссы больше
. Для нормализованных чисел диапазон составляет примерно от
до
по модулю. Нижняя граница —
, верхняя для положительных чисел —
. Для ненормализованных значений нижняя граница снижается до
; меньшие по модулю значения обращаются в машинный нуль. [Представление чисел в учебнике][fortran-book].
Мантисса содержит знак и 40 дробных разрядов — примерно 12 десятичных значащих цифр.
REALБЭСМ-6 отличается от современных форматов IEEE 754floatиdouble. При переносе бенчмарка нужно учитывать эту разницу и правила округления.
Целые числа и текст. Логическое слово может хранить маску, текстовые символы или целочисленное значение. Представление INTEGER зависит от языка и транслятора. В описанном варианте Фортрана целые числа хранятся в ненормализованном виде с порядком 40: запятая оказывается после младшего разряда мантиссы. Полного отдельного набора целочисленных арифметических операций у машины нет. Вообще, целочисленные операции были исключены намеренно, т.к. БЭСМ-6 создавалась исключительно как суперкомпьютер для автоматизации сложных научно-технических расчетов. В этих вычислениях абсолютное большинство данных требовало вещественных чисел (с плавающей запятой повышенной точности).
Понятия “байт” размером 8 бит тоже не предусмотрено. Для текста в одно слово обычно упаковывают до шести символов, а конкретная упаковка зависит от кодировки.
Система команд
В 48 разрядное слово записываются 2 команды размерностью 24 бита.
24-разрядная команда БЭСМ-6 имеет один из двух форматов. Числа в описании полей обозначают их длину в битах:
Формат | Поля от старших разрядов к младшим | Зачем нужен |
|---|---|---|
Короткий адрес | индекс 4; признак 0; расширение адреса 1; операция 6; адрес 12 | Больше кодов операций, ограниченный непосредственный адрес |
Длинный адрес | индекс 4; признак 1; операция 4; адрес 15 | Полный адрес, в частности для переходов и индексных команд |

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

Команда с длинным адресом.
Ниже приведены основные команды и их характеристики из [приложения 1 к учебнику][fortran-book]. Рядом с латинскими мнемокодами МАДЛЕНа указаны русские обозначения команд БЭСМ-6 и мнемокоды БЕМШа — по сводной таблице команд. Эти обозначения относятся к разным системам записи, поэтому смешивать их в исходном тексте программы нельзя. Экстракоды рассмотрим отдельно.
КОП — восьмеричный код операции; A — сумматор; Y — регистр младших разрядов. «Не изм.» — не изменяется, «изм.» — изменяется, «не опр.» — не определено. Время дано отдельно для устройства управления (УУ) и арифметического устройства (АУ), в тактах по 110 нс. Эти интервалы нельзя просто складывать для оценки всей программы: работа устройств перекрывается во времени. Обозначение
в строках условных переходов — условие, определяемое группой операций и содержимым сумматора; это не отдельный разряд регистра R.

Список кодов операций на самой машине.
Таблицы команд: регистры, группы операций и время выполнения
Команды с коротким адресом
КОП | МАДЛЕН (лат.) | БЭСМ-6 (рус.) | БЕМШ (рус.) | A | Y | Группа | В УУ | В АУ: min | В АУ: средн. | В АУ: max | Содержание операции |
|---|---|---|---|---|---|---|---|---|---|---|---|
000 |
|
|
| не изм. | не изм. | не изм. | 3 | 3 | 3 | 3 | Запись слова в память |
001 |
|
|
| изм. | не изм. | логич. | 6 | 5 | 6 | 6 | Запись и магазинное считывание |
003 |
|
|
| изм. | не изм. | логич. | 6 | 5 | 6 | 6 | Магазинная запись и считывание |
004 |
|
|
| изм. | изм. | слож. | 3 | 5 | 11 | 280 | Сложение |
005 |
|
|
| изм. | изм. | слож. | 3 | 5 | 11 | 280 | Вычитание |
006 |
|
|
| изм. | изм. | слож. | 3 | 5 | 11 | 280 | Обратное вычитание |
007 |
|
|
| изм. | изм. | слож. | 3 | 5 | 11 | 280 | Вычитание модулей |
010 |
|
|
| изм. | не изм. | логич. | 3 | 2 | 2,5 | 3 | Считывание слова из памяти |
011 |
|
|
| изм. | нуль | логич. | 3 | 4 | 4 | 4 | Логическое умножение |
012 |
|
|
| изм. | изм. | логич. | 3 | 2 | 2,5 | 3 | Поразрядное сравнение |
013 |
|
|
| изм. | нуль | умнож. | 3 | 3 | 6 | 27 | Циклическое сложение |
014 |
|
|
| изм. | нуль | слож. | 3 | 4 | 5 | 25 | Изменение знака числа |
015 |
|
|
| изм. | нуль | логич. | 3 | 4 | 4 | 4 | Логическое сложение |
016 |
|
|
| изм. | не опр. | умнож. | 3 | 47 | 50 | 174 | Деление |
017 |
|
|
| изм. | изм. | умнож. | 3 | 15 | 18 | 162 | Умножение |
020 |
|
|
| изм. | нуль | логич. | 3 | 53 | 53 | 53 | Сборка |
021 |
|
|
| изм. | нуль | логич. | 3 | 53 | 53 | 53 | Разборка |
022 |
|
|
| изм. | нуль | логич. | 3 | 54 | 56 | 78 | Подсчёт числа единиц |
023 |
|
|
| изм. | изм. | логич. | 3 | 7 | 32 | 78 | Определение номера старшей единицы |
024 |
|
|
| изм. | нуль | умнож. | 3 | 3 | 5 | 133 | Сложение порядков |
025 |
|
|
| изм. | нуль | умнож. | 3 | 3 | 5 | 133 | Вычитание порядков |
026 |
|
|
| изм. | изм. | логич. | 3 | 4 | нет | 68 | Сдвиг по коду порядка |
027 |
|
|
| не изм. | не изм. | регистр. | 3 | 2 | 2,5 | 3 | Установка режима |
030 |
|
|
| изм. | не изм. | не изм. | 3 | 2 | 3 | 3 | Выдача содержимого регистра признаков |
031 |
|
|
| изм. | не изм. | не изм. | 3 | 3 | 5 | 133 | Выдача младших разрядов |
034 |
|
|
| изм. | нуль | умнож. | 3 | 3 | 5 | 133 | Сложение порядка с адресом |
035 |
|
|
| изм. | нуль | умнож. | 3 | 3 | 5 | 133 | Вычитание из порядка адреса |
036 |
|
|
| изм. | изм. | логич. | 3 | 4 | нет | 68 | Сдвиг по адресу |
037 |
|
|
| не изм. | не изм. | регистр. | 3 | 2 | 2,5 | 3 | Установка режима по адресу |
040 |
|
|
| не изм. | не изм. | не изм. | 14 | 3 | 3 | 3 | Запись из сумматора в индекс-регистр |
041 |
|
|
| изм. | не изм. | логич. | 14 | 3 | 3 | 3 | Запись из сумматора в индекс-регистр и магазинное считывание |
042 |
|
|
| изм. | не изм. | логич. | 6 | 3 | 3 | 3 | Считывание индекс-регистра на сумматор |
043 |
|
|
| изм. | не изм. | логич. | 9 | 5 | 6 | 6 | Магазинная запись и считывание индекс-регистра на сумматор |
044 |
|
|
| не изм. | не изм. | не изм. | 6 | — | — | — | Передача кода из индекс-регистра в индекс-регистр |
045 |
|
|
| не изм. | не изм. | не изм. | 6 | — | — | — | Сложение кода в индекс-регистрах |
Команды с длинным адресом
КОП | МАДЛЕН (лат.) | БЭСМ-6 (рус.) | БЕМШ (рус.) | A | Y | Группа | В УУ | В АУ: min | В АУ: средн. | В АУ: max | Содержание операции |
|---|---|---|---|---|---|---|---|---|---|---|---|
22 |
|
|
| не изм. | не изм. | не изм. | 4 | — | — | — | Запись адреса в регистр изменения команд |
23 |
|
|
| не изм. | не изм. | не изм. | 13 | 3 | 3 | 3 | Запись 15 младших разрядов слова в регистр изменения команд |
24 |
|
|
| не изм. | не изм. | не изм. | 4 | — | — | — | Передача адреса в индекс-регистр |
25 |
|
|
| не изм. | не изм. | не изм. | 4 | — | — | — | Сложение индекс-регистра с адресом |
26 |
|
|
| не изм. | нуль | не изм. | 15; 12 | 3 | 3 | 3 | Условный переход при |
27 |
|
|
| не изм. | нуль | не изм. | 15; 12 | 3 | 3 | 3 | Условный переход при |
30 |
|
|
| не изм. | не изм. | не изм. | 7 | — | — | — | Безусловный переход |
31 |
|
|
| не изм. | не изм. | не изм. | 7 | — | — | — | Безусловный переход с запоминанием адреса возврата в индекс-регистре |
34 |
|
|
| не изм. | не изм. | не изм. | 7; 4 | — | — | — | Условный переход по нулевому коду в индекс-регистре |
35 |
|
|
| не изм. | не изм. | не изм. | 7; 4 | — | — | — | Условный переход по ненулевому коду в индекс-регистре |
37 |
|
|
| не изм. | не изм. | не изм. | 7; 4 | — | — | — | Конец цикла |
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 мы будем работать ниже.
Процесс разработки ПО
Алгоритм. Программист разбивал задачу на шаги, строил блок-схему, определял входные данные и промежуточные результаты.
Исходный текст. Программу записывали в тетради или на бланках. В зависимости от задачи и доступного ПО выбирали машинные коды, автокод или язык высокого уровня.
Ввод и трансляция. Текст переносили на перфокарты либо перфоленту с помощью специального оборудования. Транслятор проверял синтаксис и выдавал листинг с диагностикой.
Отладка. Программу запускали на тестовых данных. Для поиска ошибок печатали промежуточные значения на АЦПУ, использовали трассировку и контрольные точки — в пределах возможностей выбранной системы.
Работа с ОС и аппаратурой. Нехватка памяти, ошибки обмена и аппаратные сбои могли потребовать совместной работы программиста и инженера.
Проверка результата. Выходные данные сопоставляли с теоретическими расчётами и проверяли на граничных случаях. При расхождениях исправляли алгоритм или код и повторяли запуск.
Языки программирования
На низком уровне использовались автокоды — языки ассемблера с мнемоническими обозначениями команд. Пример такого языка описан в инструкции «Автокод БЭСМ-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.net cd besm6.net # Сборка dotnet build src/Besm6.Cli -c Release DLL=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.
Семейство | Задание | Нагрузка и показатель |
|---|---|---|
| 5000 проходов; процедуры, строки, целочисленные массивы; DMIPS | |
| 8 × 100 условных проходов; восемь секций; MWIPS и отдельный MFLOPS | |
| 4096 элементов, 1000 проходов; copy, add, multiply-add; логические MB/s | |
| 9000 элементов, 30 проходов; 2, 8 и 32 арифметические операции на элемент; MFLOPS |
При переносе потребовались адаптации кода, чтобы старые компиляторы могли собрать код.
В Dhrystone записи заменены параллельными массивами полей, а указатели — индексами двух узлов. Строки и вызовы процедур сохранены.
Из Memspeed перенесены три ядра: копирование, сложение и умножение со сложением.
В MP-MFLOPS используется 48-разрядный тип
REAL. Название семейства сохранено, но здесь выполняется последовательный вариант вычислительных ядер.Whetstone взят в варианте Роя Лонгботтома 1996 года. Порт сохраняет восемь секций и их число операций, а длинные циклы разбивает на блоки для совместимости с ограничениями старого Фортрана.
Настроки запуска эмулятора Besm6.Net
Во всех заданиях системная функция CTIME вызывается перед вычислительным ядром бенчмарка и сразу после него. Подготовка массивов, компиляция, проверка результата и печать находятся за пределами измеряемого интервала. В этих заданиях счётное время берётся из второго аргумента CTIME.
Источник времени зависит от режима симулятора:
Режим Besm6.Net | Источник гостевого времени | Темп выполнения |
|---|---|---|
| Статистическая модель времени БЭСМ-6 | Симулятор при необходимости ожидает, чтобы выдержать модельный темп |
| Реальное прошедшее время на хосте | Выполнение с доступной скоростью хоста |
| Счётчик модельных тактов | Выполнение с доступной скоростью хоста, без ожидания модельного темпа |
Параметр --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.dll dotnet "$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 ENDS IGLOB: 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 SPEC GUEST CPU SECONDS: 4.9800 GUEST DMIPS: 0.571438
Whetstone
Вывод нашего запуска:
ROY LONGBOTTOM WHETSTONE - BESM-6 FOREX 8 PASSES USED (X 100); REAL IS 48 BITS LOOP CONTENT RESULT MFLOPS MOPS SECONDS N1 FLOATING POINT -1.13333352534209 0.808421 0.1900 N2 FLOATING POINT -1.13333356774819 0.625116 1.7200 N3 IF THEN ELSE 1.00000000000000 0.258750 3.2000 N4 FIXED POINT 11.99999999998908 0.652850 3.8600 N5 SIN,COS ETC. 0.50000004814501 0.036733 18.1200 N6 FLOATING POINT 0.99999778767669 0.116753 36.9600 N7 ASSIGNMENTS 3.00000000000000 0.080087 18.4600 N8 EXP,SQRT ETC. 0.75792038854851 0.018213 16.3400 BAD CONTROL VALUES= 0 ALL 8 CONTROL VALUES MATCH: YES GUEST CPU SECONDS: 98.8500 GUEST MWIPS: 0.809307 GUEST MFLOPS GEOMEAN N1 N2 N6: 0.389304 Halted by STOP at 0118 after 105244035 instructions
Для исторического сопоставления ниже сохранён результат Whetstone на Pentium 100 МГц. Сравнивать следует результаты бенчмарков, учитывая язык, транслятор и точность вычислений: абсолютные времена секций зависят ещё и от числа проходов. Материалы Роя Лонгботтома о Whetstone.
К примеру, Whetstone на Pentium 100 МГц
Loop content Result MFLOPS MOPS Seconds N1 floating point -1.12475025653839100 19.971 0.274 N2 floating point -1.12274754047393800 11.822 3.240 N3 if then else 1.00000000000000000 11.659 2.530 N4 fixed point 12.00000000000000000 13.962 6.430 N5 sin,cos etc. 0.49904659390449520 2.097 11.310 N6 floating point 0.99999988079071040 3.360 45.750 N7 assignments 3.00000000000000000 2.415 21.810 N8 exp,sqrt etc. 0.75110864639282230 1.206 8.790 MWIPS 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 PRECISION Month run 7/2017 Supplier/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 двух моделей близки, но секции некоторых различаются:

Обе серии относятся к моделям. Диаграмма показывает результат калибровки, а не измеренную ошибку относительно физической БЭСМ-6. Отличаются также программное окружение и контрольные численные значения.
Memspeed
Вывод первого подтеста — копирования из массива в массив:
MEMSPEED PART 1 WORDS= 4096 REPEAT PASSES= 1000 BYTES/ELEMENT= 12 DATA TRAFFIC BYTES= 49151999.999958206899 FIRST RESULT= 0.000244140625 LAST RESULT= 1.000000000000 CHECKSUM= 2048.499999997147 BAD ELEMENTS= 0 ALL VALUES MATCH: YES GUEST CPU SECONDS: 8.6800 GUEST MB/S: 5.662673 Halted by STOP at 0118 after 24959421 instructions
MP-MFLOPS
Первый подтест выполняет две арифметические операции на элемент. Для 9000 элементов и 30 проходов это 540 000 операций. При гостевом времени 1,1 с получается 0,490909 MFLOPS, что соответствует строке сводной таблицы.
MP-MFLOPS PART 1 WORDS= 9000 OPS/WORD= 2 REPEAT PASSES= 30 FLOPS= 539999.999998690327 FIRST RESULT= 0.999099623640 BAD CONTROL VALUES= 0 CALCULATIONS PERFORMED ALL SAME: YES GUEST CPU SECONDS: 1.1000 GUEST MFLOPS: 0.490909 Halted 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: читать листинг исторического Фортрана, менять представление данных и наблюдать влияние алгоритма. Его исходный код позволяет проследить, какие зависимости учитывает модель, что считается обращением к памяти и сколько времени назначено системной функции.
Следующий шаг — испытать модель на независимом историческом наборе программ, не участвовавшем в настройке коэффициентов. Особенно полезны задачи с разным соотношением арифметики, обращений к памяти и системных услуг. Пока такого сравнения нет, приведённые измерения характеризуют симулятор и его временную модель.
Ссылки
Книги и техническая документация
Салтыков А. И., Макаренко Г. И. [Программирование на языке Фортран][fortran-book] / под ред. Н. Н. Говоруна. М.: Наука, 1976. 256 с. Серия «Библиотечка программиста». Основной источник по архитектуре, арифметике, системе «Дубна» и МАДЛЕНу. [][fortran-scan].
Автокод БЭСМ-6. Инструкция. ИТМиВТ АН СССР, 1969. Форматы команд и чисел, ввод и отладка программ.
Краткий перечень команд БЭСМ-6. Сопоставление машинных кодов, русских обозначений, мнемокодов БЕМШа и МАДЛЕНа.
Электронные цифровые вычислительные машины общего назначения. Каталог, 1968.
Техническая документация БЭСМ-6. Сканированные описания устройств, системы команд и пультов.
История машины и программного обеспечения
БЭСМ-6 в Виртуальном компьютерном музее, история серии БЭСМ и описание архитектуры и ПО БЭСМ-6.
НИИсчётмаш: историческая справка. Разработка устройств семейства АЦПУ-128 и ВУ-700.
Материалы об операционной системе ДИСПАК и «Четыре поколения операционных систем», SORUCOM 2020.
Control Data 6400/6600 Computing Systems’ Configurator. CDC, 1966. Отчёт Lax содержит историческую таблицу производительности систем NCAR.
Симуляторы, бенчмарки и результаты
Besm6.Net — исходный код исследуемого симулятора; задания бенчмарков и таблица измерений.
Dubna BESM-6 Emulator и SIMH; руководство по SIMH для БЭСМ-6.
Dhrystone 2.1: материалы Netlib. Происхождение теста и нормировка относительно VAX-11/780.
Коллекция бенчмарков Роя Лонгботтома. История и результаты Whetstone, Memspeed и MP-MFLOPS; ссылки на архивные материалы и исходные тексты.
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 ENDS IGLOB: 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 SPEC GUEST CPU SECONDS: 4.9800 GUEST DMIPS: 0.571438 Halted by STOP at 0118 after 17292960 instructions
[fortran-book]: Салтыков А. И., Макаренко Г. И. [Программирование на языке Фортран][fortran-book] / под ред. Н. Н. Говоруна. М.: Наука, 1976. 256 с. Серия «Библиотечка программиста» [fortran-scan]: Салтыков А. И., Макаренко Г. И. [Программирование на языке Фортран][fortran-book] / под ред. Н. Н. Говоруна. М.: Наука, 1976. 256 с. Серия «Библиотечка программиста»

