История изменений
Исправление 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.