Очевидно, что архитектура процессора способного выполнить программный текст на языке «триад» должна принципиально отличаться от всех известных фон-неймановской и не-фон-неймановских (потоковая и редукционная) архитектур.
Так, во-первых, отличен способ описания информационных связей между операциями и, следовательно, будет отличен способ их реализации. Если в фон-неймановской модели информационные связи между командами (операциями) явно не описываются и реализуются опосредованно, через память (регистры общего назначения, ЗУ), то на языке «триад» они задаются явно, указанием информационных связей между командами. При этом, в отличие от не-фон-неймановских моделей способ задания носит не адресный, а выборочный характер. Результат команды не посылается конкретному потребителю (потоковые процессоры) и не указывается конкретная команда для получения результата (редукционные процессоры), а потребители сами должны выбирать требуемые им результаты из общего потока результатов, который формируется не по заявкам, а императивно, путем выборки и исполнения всех команд линейного участка. Следовательно, архитектура процессора должна иметь механизм идентификации получаемых результатов и интеллектуальную коммутационную среду, обеспечивающую не только широковещательную рассылку всех результатов, но и отбор необходимых результатов для конкретных операций.
Во-вторых, отличен и сам этот процесс. Если потоковые и редукционные процессоры имеют неупорядоченную выборку и исполнение команд, «по готовности» данных или «по запросу» результата, соответственно, то язык «триад» предполагает последовательную выборку команд линейного участка и исполнение их не только «по готовности» данных, но и «по готовности» потребителей результатов. А именно, выбранная команда не может быть выполнена до тех пор пока не будут получены все операнды (готовность данных) и пока не будут выбраны все команды использующие ее результат (готовность потребителей). Такой подход к исполнению последовательно выбираемых команд связан с их неупорядоченностью.
Неопределенность временного интервала с момента выборки и до момента исполнения команды предполагает использование механизмов буферизации команд, обеспечивающих хранение выбранной команды, комплектование ее операндами, отобранными из потока результатов и выдачу ее на исполнение после выборки всех потребителей ее результата.
Рассмотрим параллельную систему показанную на рисунке 2.1 и состоящую из N процессорных блоков PU_0, PU_1, …, PU_n-1 связанных между собой однонаправленным коммутатором(SB) типа «каждый с каждым», имеющим N информационных входов и 2N информационных выходов, а также 2N адресных входов.
Рисунок 2.1 — Концептуальная схема процессора
Предположим, что система содержит четыре процессорных блока (клетки). Разместим рассматриваемую последовательность команд в РМ процессорных блоков, начиная с нулевого PU так, как показано на рисунке 2.2. Каждой триаде сопоставим индивидуальный тег (адреса и значения тегов приведены для 0-го PU).
Адрес | Тег | PM_0 | PM_1 | PM_2 | PM_3 |
A+0 A+4 A+8 | t+0 t+4 t+8 | RD a RD e / 5,6 | RD b - 0,2 + 7,8 | RD c RD f WR 9,a | + 0,1 * 3,4 |
Рисунок 2.2 - Размещение программы в памяти программ процессорных блоков
Для того, чтобы обеспечить параллельное выполнение данной программы функциональными блоками процессора, структура которого приведена на рисунке 2.1, необходимо:
обеспечить согласованную (когерентную) выборку команд находящихся в одной строке;
организовать процесс динамического формирования значений тегов таким образом, чтобы он учитывал количество функциональных блоков осуществляющих выборку команд и их относительные номера.
Процесс выборки командных слов инициализируется передачей управления на линейный участок. Он начинается с выборки первой команды линейного участка из памяти программ (PM) и продолжается до выборки последней команды. При этом выполняются следующие действия.
Для каждой выбранной команды динамически формируется значение тега. Оно равно сумме последнего использованного значения тега при выборке команд и количества функциональных блоков. Значение тега ссылки рассчитывается как сумма начального значения тега на данном линейном участке и номера ссылки. Значение тега в процессе выборки команд изменяется циклически. Его максимальная величина определяется емкостью буфера.
Команда записывается в свободную строку буфера. Если команда содержит значение аргумента непосредственно в командном слове, например, адрес переменной находящейся в памяти данных (DM), то это значение также переписывается в соответствующее поле этой строки буфера. После записи “заготовки” команды в строку буфера устройство управления (CU) приступает к выборке следующей команды.
Процесс приостанавливается после выборки, отмеченной специальным признаком, последней команды линейного участка, которая выбирается и выполняется на общих основаниях. Следует отметить, что последней командой может быть любая команда, а не только команда, которая формирует начальный адрес нового линейного участка. Команда, формирующая начальный адрес следующего участка, может занимать любое место в выполняемом участке. Сформированный ею адрес рассылается всем функциональным блокам, которые на основании его вычисляют свой адрес передачи управления на следующий участок и выполняют эту передачу (возобновляют выборку) после получения сигнала о выборке последней команды текущего участка. Выборка также заканчивается, когда заполнен буфер и возобновляется, когда буфер освобождается.
Поля аргументов в строках буфера организованы как два массива с ассоциативной адресацией. Ассоциативным адресом, по которому осуществляется запись значения поступающего результата при совпадении его с тегом результата является тег запрашиваемого результата.
Команда находится в буфере до тех пор, пока в буфер не придут запрошенные ею результаты и пока в буфера не будут записаны все команды использующие ее результат. Если эти условия удовлетворяются хотя бы для одной команды, инициализируется процесс исполнения команд. При этом, если готовых к исполнению команд несколько, то на исполнение передается команда, которая была выбрана раньше всех.
Исполнительное устройство (EU) выполняет команду и выдает в буфер её результат с тегом, равным тегу исполненной команды. Завершается или приостанавливается этот процесс тогда, когда в буфере нет готовых к исполнению команд.