logo
Методичка

7.3.2 Мультитредовые программы

Программа, предназначенная для исполнения на мультитредовом процессоре, должна обеспечивать возможность быстрого обхода ее ГУЗ, в результате которого производится распределение множества сегментов по множеству процессоров.

Спецификация кода для каждого сегмента одинакова. Сегмент определяется как фрагмент программы для последовательной машины. Хотя система команд, в которой представляется код, оказывает влияние на конструкцию каждого индивидуального процессора, это не оказывает влияния на остальную часть конструкции мультитредового процессора.

Для ускорения обхода ГУЗ планировщику мультитредового процессора требуется информация о структуре потока управления программы. В частности, требуется знать, какие сегменты являются возможными преемниками любого сегмента в ГУЗ. Планировщик мультитредового процессора использует эту информацию для предсказания одного из возможных сегментов-преемников и продолжения обхода ГУЗ, начиная с текущей отметки. Такая информация может быть определена статически и помешена в описатель сегмента. Описатели сегментов могут быть расположены внутри текста программы (например, перед кодом сегмента) или помещены отдельно, рядом с текстом программы (например, в конце).

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

Процедура обработки регистровых значений проста. В результате статического анализа ГУЗ компилятором формируется маска создания. Потребляя значения, сегмент ожидает их только в том случае, если они еще не были произведены сегментом-предшественником. Иначе она находит требуемые значения внутри локальной памяти, переданные по кольцу сегментом-предшественником.

Естественным является расположение маски создания внутри описателя сегмента. Так как сегмент может содержать множество базисных блоков, выполнение которых зависит от обрабатываемых данных, не представляется возможным определить статически, какие регистровые значения будут созданы в динамике вычислений из-за возможных условных переходов. Маска создания должна быть консервативной и, вследствие этого, включать все возможные регистровые значения, которые могут быть произведены.

По мере выполнения процессором команд сегмента производимые значения регистров пересылаются последующим сегментам. Так как ПЭ не может определять априорно, какие команды содержит назначенный ему сегмент, он не может знать, какие из команд выполняют модификацию регистров, чье значение должно быть послано другим сегментам. В соответствии с последовательной семантикой другим сегментам должен быть послан только результат последней модификации регистра в сегменте. Стратегия, связанная с ожиданием выполнения всех команд в сегменте (когда никакие дальнейшие модификации регистров не возможны), нецелесообразна, т.к. это часто приводит к ожиданию другими сегментами значения, которое уже является доступным.

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

Компилятор имеет возможность определения последней команды в сегменте, которая модифицирует соответствующий регистр. Он может отметить эту команду как специальную (выполнить и переслать) команду, которая в дополнение к выполнению определенной операции направляет результат следующим ПЭ. Кроме того, поскольку ПЭ выполняет команды сегмента, он может идентифицировать те регистры, для которых значения не будут произведены.

По тем же самым причинам процессор не может определить, какие команды в действительности выполняет назначенный ему сегмент, так же, как не может определить априорно, на какой команде сегмент завершится, т.е. в какой точке управление передается вне сегмента. Во время разбиения компилятором ГУЗ на сегменты определяются границы сегмента и узлы передачи управления. Команда в одном из этих узлов передачи управления может быть отмечена специальными условиями остановки так, чтобы соответствующие условия могли быть оценены к моменту выборки такой команды процессором. Если связанные с командой условия останова выполнены, то сегмент завершен.

Спецификация пересылки и останова может быть задана с помощью добавления теговой битовой отметки (битов пересылки и стоповых битов) к каждой команде сегмента. Возможно также другое введение битовых отметок. Например, с каждой статической командой может быть ассоциирована таблица теговых битов. Аппаратные средства выбирают команды из текста программы и соответствующие битовые отметки из таблицы объединяют эту пару в новую команду и помещают в кэш-память команд. Освобождение регистра может быть задано добавлением специальной команды освобождения базовой системе команд.

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