LINUX.ORG.RU

История изменений

Исправление numas13, (текущая версия) :

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

EPIC не столько про кодирование инструкций (aka VLIW/CISC/RISC/etc), сколько про модель исполнения. В классическом VLIW в такт запускается ровно 1 бандл как то позволяет кодирование операций. В EPIC исполняется группа бандлов (в IA-64 обычно по 3 операции на бандл по 2 бандла в такт). В группе между операциями нет RAW зависимостей (помимо доступа в память, управления потоком исполнения и прочих исключений), то есть такая ситуация является UB:

{ // group 0
   add r0 = r1, r2
   op1
   op2
}
{
   add r3 = r4, r0 // undefined behaviour, used r0 in the same group 0
   op4 rN = ... ;; // stop group 0
   op5 r5 = r6, r0 // OK, group 1
}
{ // group 1, bundle 0
   ...

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

Это всё очень поверхностно, т.к. существуют разные подходы к исполнению самих бандлов (группы операций одновременно поступающих в декодер, хотя и это не обязательно). Например в E2K доступ в память также упорядочен в ШК/бандле. Но возможны и более современные подходы по внедрению зависимых (читай bypass’у вычисленных значений в этой же группе) операций в одной группе. Например такое:

{
   ld_i64 r0 = [addr]
   add r1 = r0, 0x10
   st_i64 [addr] = r1 // *addr += 0x10
   br label
}

Это позволяет 1 бандлом (1 такт) выполнить такую группу операций, а не запускать 3 бандла (3 такта). Уже сильнее отходит от изначальных идей заложенных в VLIW, но не так сильно как EPIC.

E2K очень старая архитектура. Она физически не могла далеко отойти от первоначальных (классических) идей. В E2K очень много разных фич на все случаи жизни. Объединяет их одно, они все работают в связке с программным обеспечением. Это сродни споров вокруг ARM, и того что он якобы не RISC.

Если же проводить параллели по VLIW составляющей IA-64, то он очень похож на E2K (хоть и сильно проще в этом, делали одни и те же люди), но по модели запуска операций кардинально от него отличается (как я понимаю это хотелка Intel). Вот и получается EPIC + VLIW.

Исходная версия numas13, :

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

EPIC не столько про кодирование инструкций (aka VLIW/CISC/RISC/etc), сколько про модель исполнения. В классическом VLIW в такт запускается ровно 1 бандл как то позволяет кодирование операций. В EPIC исполняется группа бандлов (в IA-64 обычно по 3 операции на бандл по 2 бандла в такт). В группе между операциями нет RAW зависимостей (помимо доступа в память, управления потоком исполнения и прочих исключений), то есть такая ситуация является UB:

{ // group 0
   add r0 = r1, r2
   op1
   op2
}
{
   add r3 = r4, r0 // undefined behaviour, used r0 in the same group 0
   op4 rN = ... ;; // stop group 0
   op5 r5 = r6, r0 // OK, group 1
}
{ // group 1, bundle 0
   ...

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

Это всё очень поверхностно, т.к. существуют разные подходы к исполнению самих бандлов (группы операций одновременно поступающих в декодер, хотя и это не обязательно). Например в E2K доступ в память также упорядочен в ШК/бандле. Но возможны и более современные подходы по внедрению зависимых (читай bypass’у вычисленных значений в этой же группе) операций в одном группе. Например такое:

{
   ld_i64 r0 = [addr]
   add r1 = r0, 0x10
   st_i64 [addr] = r1 // *addr += 0x10
   br label
}

Это позволяет 1 бандлом (1 такт) выполнить такую группу операций, а не запускать 3 бандла (3 такта). Уже сильнее отходит от изначальных идей заложенных в VLIW, но не так сильно как EPIC.

E2K очень старая архитектура. Она физически не могла далеко отойти от первоначальных (классических) идей. В E2K очень много разных фич на все случаи жизни. Объединяет их одно, они все работают в связке с программным обеспечением. Это сродни споров вокруг ARM, и того что он якобы не RISC.

Если же проводить параллели по VLIW составляющей IA-64, то он очень похож на E2K (хоть и сильно проще в этом, делали одни и те же люди), но по модели запуска операций кардинально от него отличается (как я понимаю это хотелка Intel). Вот и получается EPIC + VLIW.