280 likes | 588 Views
IA64 . Архитектура и обзор системы команд. Юрий Долгов , Дмитрий Шкурко. План. Обзор IA-64 архитектуры Обзор системы команд. IA-64 архитектура. Регистры Порты Бандл Кэши, ALAT и исполнительные устройства. Регистры. Целочисленные регистры.
E N D
IA64. Архитектура и обзор системы команд Юрий Долгов, Дмитрий Шкурко
План • Обзор IA-64 архитектуры • Обзор системы команд
IA-64 архитектура Регистры Порты Бандл Кэши, ALAT и исполнительные устройства
Регистры. Целочисленные регистры • 128 регистров общего назначения (General Registers) • 1 регистр = 64 бита • 32 статических регистра (Static registers) • 96 стековых вращающихся регистров (Rotating registers). Количество реально вращающихся определяется программно,но должно быть кратно 8 • GR0 == 0 • Каждому регистру соответствует NaT бит • Все регистры доступны программисту
81 80 64 63 0 sign exponent significand Регистры. Регистры для вычислений с плавающей точкой • 128 регистров данных с плавающей точкой (Float-point Registers) • 1 регистр = 82 бита • 32 статических регистра (Static registers) • 96 вращающихся регистров (Rotating registers). Вращаются все 96регистров • FPR0 == 0.0f • FPR1 == 1.0f • Зарезервировано специальное NaTVal значение • Все регистры доступны программисту
Регистры. Регистры предикатов • 64 регистра предикатов (Predicate Registers) • 1 регистр = 1 бит • 16 статических регистров • 48 вращающихся регистров. Вращаются все 48 регистров • PR0 == 1
Регистры. Регистры переходов. Регистры приложений • 8 регистров перехода (Branch Registers) • 128 регистров приложений (Application Registers) • Счетчик циклов ar.lc (Loop Count Register) • Счетчик эпилога ar.ec (Epilog Count Register) • Регистр состояния устройства обработки данных с плавающей точкой (Float-point Status Register) • Другие
Integer Registers 63 0 bit 0 0 GR0 1 PR0 GR1 PR1 GR31 PR15 GR32 PR16 PR63 GR127 Static Static Stacked, Rotating Rotating Регистры Branch Registers Predicate Registers 63 0 BR0 BR7 FP Registers 81 0 FR0 +0.0 FR1 +1.0 FR2 NaT FR31 FR32 FR127
Регистровый стек Outputs Outputs Outputs Outputs Call Alloc Ret PROC A PROC B PROC B PROC A • Каждая процедура заказывает себе требуемое ей количество стековых регистров командой alloc • Кадр предоставляемых регистров делится на три части: Inputs, Local, Outputs • Outputs является Inputs для вызываемой процедуры 56 48 Local Virtual 52 52 (Inputs) 32 32 46 46 Local Local (Inputs) (Inputs) 32 32
Порты и исполнительные устройства • Порт – устройство, через которое инструкция достигает исполняющего устройства • M-порт – для команд обмена данными с кэш, арифметических и логических операций Itanium2 – M0, M1, M2, M3 • I-порт – для команд арифметических и логических операций, операций сдвига I0, I1 • B-порт - длякоманд переходов B0, B1, B2 • F-порт – для команд с операндами - числами с плавающей точкой F0, F1 Исполнительные устройства • 1 устройство взаимодействия с кэшами • 3 устройства переходов • 4 устройства обработки чисел с плавающей запятой • 17 устройств работы с целочисленными данными
template 4 bits Бандл (bundle) 128 bits (bundle) Instruction 2 Instruction 1 Instruction 0 dispersal • Бандл (16 байт) – единица двоичного исполняемого кода, содержит группу из трех команд и поле шаблона (template) • 1 бандл = 128 бит • 3 инструкции в бандле по 41 биту (слоты) • типы слотов соответствуют типам портов (M, I, F, B) и определяются шаблоном • Граница группы инструкций определяется “stop” битом или шаблоном 41 bits 41 bits 41 bits s t o p
Кэш • L1D Кэш данных первого уровня • 16 KB, 4-way set associative with 64-byte lines • Write through, no write allocate • L1I Кэш инструкций первого уровня • 16 KB, 4-way set associative with 64-byte lines • L2 Кэш второго уровня • 256 KB, 8-way set associative with 128-byte lines • Write back, write allocate • Команды загрузки данных с плавающей точкой обращаются сразу в кэш второго уровня • L3 Кэш третьего уровня • 3 MB, 12-way set associative with 128-byte lines, on chip • ALAT Таблица ранних загрузок
Обзор системы команд Команда alloc Команды обмена данными Арифметические и логические команды Команды сравнения Команды сдвига Команды обработки данных с плавающей точкой Команды параллельной обработки Команды переходов Влияние предикатов на команду
Формат инструкций • (pn) instr_name.prf1.prf2… dst1, dst2 = op1, op2, … (;;) • pn– предикатный регистр • instr_name– мнемоника инструкции • prf1, prf2…– указывают на опцию инструкции • dst1, dst2 – приемники результата • op1, op2… – операнды Пример: (p6) fma f32 = f33, f34, f35( f32 = f33 * f34 + f35 )
Обзор системы команд. Команда alloc • Должна стоять первой в вызываемой функции • Формат alloc R1 = i, l, o, r • в регистр R1копируется регистр состояния предыдущей функции, обычно, его можно не сохранять (и не восстанавливать), если в функции регистр состояния не изменяется • i – количество передаваемых в функцию целочисленных и адресных параметров • l – количество локальных переменных (нестатических стековых регистров), которые будут использоваться в функции • o – количество передаваемых целочисленных и адресных параметров для функции, которая будет вызываться из данной функции • r – количество нестатическихстековых целочисленных регистров, которые будут вращаться,r – кратно 8 • общее количество задействованных нестатических стековых регистров s = i + l + o; r <= s;
Обзор системы команд. Команды обмена данными • ld1, ld2, ld4, ld8 – загружают в целочисленный регистр из памяти соответствующее количество байт; результат расширяется нулем • st1, st2, st4, st8 – выгружают в память соответствующее количество байтов из целочисленного регистра, начиная с нулевого • ldfs, ldfd, ldfe – загружает из памяти число, представленное в формате IEEE754, в регистр данных с плавающей точкой, одновременно преобразует его во внутренний формат процессора • ldfps, ldfpd – то же самое, но загружает сразу 2 регистра • ldf8, ldf.fill – загружает из памяти данныебез какого-либо преобразования • ldfp8 – то же самое, но загружает сразу 2 регистра • stfs, stfd, stfe, stf8, stf.fill – выгружает из регистра данных с плавающей точкой в память в соответствующем формате
Обзор системы команд. Команды обмена данными • ldX.aранняя загрузка • ldX.cспекулятивная загрузка
Обзор системы команд. Команды обмена данными • Команда MOV – копирует данные из одного регистра в другой • mov r1 = r2 – псевдокоманда; реально ассемблер превращает ее в команду add r1 =r0, r2, про это полезно помнить • mov f1 = f2 – тоже псевдокоманда, которая реально превращается в fmerge f1 = f2, f2, что тоже полезно помнить, т.к. fmerge исполняется только в устройстве F0 • Команды setf, getf – позволяют передавать данные из регистров общего назначения в регистры данных с плавающей точкой и обратно
Обзор системы команд. Арифметические и логические команды • add, sub, and, or, xor и т.п. – естественно, присутствуют • shladd r1 = r2, n, r3 – операнд из r2сдвигается влево на nразрядов (n=1-4), к результату прибавляется операнд из r3и полученная сумма помещается в r1
Обзор системы команд. Команды сравнения • cmp.crel p1, p2 = r1, r2 – если результат сравнения, который указан в crel (crel = lt, gt, le,etc), выполняется, то в регистр предикатов p1помещается 1, иначе 0; в регистр предикатов p2помещается инверсия p1 • tbit.trel p1, p2 = r1, n – проверяет n-ый бит в регистре r1, если он удовлетворяет условию в trel (trel = nz – не нуль или z – нуль), то в регистр предикатов p1помещается 1, иначе = 0; в регистр предикатов p2помещается инверсия p1
Обзор системы команд. Команды сдвига • shr, shl r1 = r2, r3 – сдвигает содержимое регистра r2 в соответствующем направлении и помещает в регистр r1; на сколько – указано в регистре r3; может выполняться в I0 и I1 устройствах • shr, shl r1 = r2, n – сдвигает содержимое регистра r2 в соответствующем направлении на nразрядов и помещает в регистр r1; псевдокоманда – реализуется через команды extr, и как следствие, может выполняться только в I0
Обзор системы команд.Команды обработки данных с плавающей точкой • fma, fms, fnma f1 = f2, f3, f4 – основные команды вычислений; по порядку: умножает и складывает, умножает и вычитает, умножает и выполняет обратное вычитание • fmax, fmin – мнемоника все об’ясняет • frcpa, frsqrt – вычисляют обратную величину и обратный квадратный корень с относительной точностью 2**-8; первое приближение для итерационных вычислений • fmerge – собирает от разных операндов знак, порядок, мантиссу и формирует новое число; на fmerge опирается много псевдокоманд, например fabs • fand, for, fxor– выполняют побитовые логические операции над операндами из регистров данных с плавающей точкой • fcvt– выполняет преобразование целочисленных данных в числа с плавающей точкой и в обратную сторону • Другие
Обзор системы команд. Команды параллельной обработки • Параллельные команды для регистров общего назначения. Эти команды обращаются к регистрам общего назначения как к 2-ум двойным словам, 4-ем словам или 8-ми байтам, причем как к числам со знаком, так и без знака • padd, psub, pmpy, pmax, pmin,pcmp, pshl, pshr – мнемоника команд все сообщает • pshladd, pshradd, pmpyshr – те же арифметические действия, но еще присутствует сдвиг • pack, unpack, mix, mux – команды упаковки/распаковки данныхи изменения позиции в регистре • Параллельные команды для обработки данных с плавающей точкой. Рассматривают 64 бита регистра как два 32-разрядных числа с плавающей точкой. • fpmpa, fpms,- арифметические действия • fpack, fswap– команды упаковки, изменения позиции в регистре
Обзор системы команд. Командыпереходов • brlabel – переход на метку; на самом деле в коде указывается смещение относительно счетчика команд, оно должно укладываться в 25 двоичных разрядов • br bn – переход по адресу из регистра переходов bn • br.ret b0 – последняя команда в программе • br.cloоp start_loop – один из вариантов последней команды в цикле; если счетчик циклов не нуль, то он декрементируется и выполняется переход на начало цикла, иначе – выход из цикла • br.ctop start_loop, br.wtop start_loop, • br.cexit start_loop, br.wexit start_loop – тоже варианты последней команды цикла. Данные команды позволяют организовать цикл с программным конвейером.
Обзор системы команд. Влияние предикатов на команду • Почти все команды имеют поле для указания на предикатный регистр. По умолчанию команде соответствует регистр p0 (p0==1) • Команда выполняется только в том случае, если соответствующий ей предикатный регистр установлен в 1, иначе команда не исполняется (p8) add r1 = r2, r3 • Механизм предикатов позволяет избавляться от ветвлений, и как следствие, уменьшить число промахов при переходах. Также механизм предикатов позволяет реализовать программный конвейер.