Статус
нашего
сайта:
ICQ Secrets Center is Online  ICQ Information Center


ICQ SHOP
     5-значные
     6-значные
     7-значные
     8-значные
     9-значные
     Rippers List
ОПЛАТА
СТАТЬИ
СЕКРЕТЫ
HELP CENTER
OWNED LIST
РОЗЫСК!New!
ICQ РЕЛИЗЫ
Протоколы ICQ
LOL ;-)
Настройка компьютера
Аватарки
Смайлики
СОФТ
     Mail Checkers
     Bruteforces
     ICQTeam Soft
     8thWonder Soft
     Other Progs
     ICQ Patches
     Miranda ICQ
ФорумАрхив!
ВАШ АККАУНТ
ICQ LiveJournal

Реклама

Наш канал:

irc.icqinfo.ru

Таненбаум Э.- Архитектура компьютера. стр.245


Таненбаум Э.- Архитектура компьютера. стр.245

Программа в такой форме может быть представлена в виде ориентированного графа, как показано на рис. 4.30. Здесь мы вычисляем сумму кубов четных и нечетных целых чисел до какого-либо предела и помещаем результаты в переменные еуепэит и осИБит соответственно (листинг 4.6). В пределах каждого базового блока технологии, упомянутые в предыдущем подразделе, работают отлично.

Таненбаум Э.- Архитектура компьютера.

Рис. 4.30. Граф базового блока для фрагмента программы, приведенного в листинге 4.6

Листинг 4.6. Фрагмент программы

evesum=0; oddsum=0; 1=0;

while (I<limit) { k=i*i*i;

if(((i/2)*2)-=i)

evensum=evensum+k;

else

oddsum=oddsum+k; i=i+l;

}

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

Посмотрите еще раз на рис. 4.30. Представим, что все переменные, кроме evensum и oddsum, были помещены в регистры. Тогда имело бы смысл переместить

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

В связи со спекулятивным исполнением команд возникают некоторые интересные проблемы. Например, очень важно, чтобы ни одна из спекулятивных команд не давала результата, который невозможно отменить, поскольку позднее может оказаться, что эту команду не нужно было выполнять. Обратимся к листингу 4.6 и рис. 4.30. Очень удобно производить сложение, как только появляется значение к (даже до условного оператора if), но при этом нежелательно сохранять результаты в памяти. Чтобы предотвратить перезапись регистров до того, как станет известно, нужны ли полученные результаты, нужно подменить все выходные регистры, которые используются спекулятивной командой. Как вы можете себе представить, счетчик обращений для отслеживания всех этих ситуаций очень сложен, но при наличии соответствующего аппаратного обеспечения его вполне можно создать.


⇐ Предыдущая страница| |Следующая страница ⇒

.