A=B*C
D=E+F
G=H-I
Эти три команды можно выполнять в любом порядке, потому что они независимы по данным - ни одна из них не использует переменных, изменяемых другими командами. Эти три команды, поступив в процессор, могут выполняться независимо, причем на разных устройствах: умножителе, сумматоре и вычитателе соответственно (здесь специально подобраны команды, которые не используют одинаковые операции - это упрощает рассмотрение). Но если они выполняются независимо, ничто не мешает командам, поступившим позднее, закончиться раньше - это и есть суперскалярность, точнее, одно из ее проявлений.
Суперскалярность может быть как явной для программиста/компилятора, так и прозрачной для них. В первом случае процессор выполняет по несколько команд за такт, игнорируя возможные влияния выполнения предшествующей, по ходу выполнения, команды на аргументы последующей; программист, пишущий в кодах процессора, или автор компилятора обязаны учесть это. Во втором случае процессор учитывает это влияние и блокирует выполнение команд, чьи аргументы еще не вычислены, а игнорирование суперскалярности процессора программистом или автором компилятора приведет не к неправильному выполнению программы, а лишь к потере эффективности.
Пример:
A=B+1
C++ (увеличить C на единицу)
D=E-2
F=7-C
Если процессор попытается выполнить четвертую операцию до того, как закончит вторую, то ему попадется старое (неувеличенное) значение “С”. Процессор с явной суперскалярностью так и вычислит; процессор с прозрачной суперскалярностью заблокирует выполнение четвертой операции до тех пор, пока не выполнит вторую (в данном случае было бы эффективнее поменять местами первую и вторую команды - у процессора было бы больше места для маневра). Кроме того, третья и четвертая команды конфликтуют между собой за доступ к вычитателю - если вычитатель один, то это вызовет ошибку при явной суперскалярности и задержку при прозрачной.
Суперскалярный процессор может “заглатывать“ команды одновременно, а может по очереди (этот случай является производным от конвейера). Тесно связана с суперскалярностью оптимизация выполнения команд, которая также реализуется на аппаратном уровне. Она обеспечивает выполнение команд в порядке, исключающем их зависимость друг от друга по данным. Процессор загружает в специальный буфер небольшую последовательность микрокоманд, а затем разбирается, какие из них лучше выполнить в данный момент (пусть даже не в порядке следования) с учетом сложившейся ситуации — например, произвести арифметические действия или заранее запросить данные из памяти, чтобы потом, когда они будут нужны, не тормозить:). Полученные результаты сохраняются в специальных буферных регистрах процессора, а затем восстанавливается нормальный порядок выполнения микрокоманд.
nexus (#44, 2005-06-05, 21:17:42 )
rezuq,
А теперь несколько опусов с моей стороны:
1. Проблема первая состоит в том, что пока непонятно что конкретно считать данными, а что операциями, когда речь заходит о ЦС.
2. С одной стороны, я склоняюсь рассматривать в качестве конвейера осознание человека (как виртуальная машина), а с другой стороны сюжетная ловушка (сюжет включается в себя несколько цепочек событий).
3. Если предположить что сюжет является конвейером, то тогда можно даже считать что вообще однотипные сюжетные ловушки -- это один и тот же конвейер в работе.
4. Деление сюжетных ловушек на активные, параллельные и потенциальные отражает эффект прозрачной суперскалярности: параллельные подсюжеты (ЦС) внутри некоторой сюжетной ловушки -- это независимое вычисление двух и более ЦС; потенциальные ЦС -- это явление задержки процесса в случае конфликтов.
5. Если опираться на упомянутую ранее мною модель сюжетной ловушки как пространственного файла (сингулярность) с некоторым набором параметров, внутри которого происходят случайные переходы, то можно говорить вот о чём. Так как все варианты (цепочки событий) переходов внутри сюжетной ловушки (в нашем случае это как конвейер) заданы вероятностями, то тем самым стирается грань между основным потоком и альтернативными. В результате просчитываются все и тем допускается полный параллелизм. Каждая из ветвей может реализоваться с определённой вероятностью. Очень напоминает квантовый подход. Возможно это как раз и реализованно в квантовом программировании, но утверждать не буду, так как не знаю. Причём заметь, здесь скорее всего реализуется явная суперскалярность, так как просчитываются даже конфликтные ветви.
Читать дальше