Рассмотрим параллельную систему показанную на рисунке 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) выполняет команду и выдает в буфер её результат с тегом, равным тегу исполненной команды. Завершается или приостанавливается этот процесс тогда, когда в буфере нет готовых к исполнению команд.
Следует отметить, что в процессе исполнения команд, клетки свои действия не согласовывают и работают независимо. Клетка выполняя команду не знает, кто будет потребителем результата. Не определена и очередность исполнения команд. Она определяется потоками данных и команд.