Optimization of applications for Intel* platforms 1 IA64. Архитектура и обзор системы команд Юрий Долгов, Дмитрий Шкурко
Optimization of applications for Intel* platforms План Обзор IA-64 архитектуры Обзор системы команд
Optimization of applications for Intel* platforms IA-64 архитектура Регистры Порты Бандл Кэши, ALAT и исполнительные устройства
Optimization of applications for Intel* platforms Регистры. Целочисленные регистры 128 регистров общего назначения (General Registers) 1 регистр = 64 бита 32 статических регистра (Static registers) 96 стековых вращающихся регистров (Rotating registers). Количество реально вращающихся определяется программно, но должно быть кратно 8 GR0 == 0 Каждому регистру соответствует NaT бит Все регистры доступны программисту
Optimization of applications for Intel* platforms Регистры. Регистры для вычислений с плавающей точкой 128 регистров данных с плавающей точкой (Float-point Registers) 1 регистр = 82 бита 32 статических регистра (Static registers) 96 вращающихся регистров (Rotating registers). Вращаются все 96 регистров FPR0 == 0.0f FPR1 == 1.0f Зарезервировано специальное NaTVal значение Все регистры доступны программисту significandexponentsign
Optimization of applications for Intel* platforms Регистры. Регистры предикатов 64 регистра предикатов (Predicate Registers) 1 регистр = 1 бит 16 статических регистров 48 вращающихся регистров. Вращаются все 48 регистров PR0 == 1
Optimization of applications for Intel* platforms Регистры. Регистры переходов. Регистры приложений 8 регистров перехода (Branch Registers) 128 регистров приложений (Application Registers) Счетчик циклов ar.lc (Loop Count Register) Счетчик эпилога ar.ec (Epilog Count Register) Регистр состояния устройства обработки данных с плавающей точкой (Float-point Status Register) Другие
Optimization of applications for Intel* platforms Регистры Branch Registers 630 BR7 BR0 GR1 GR31 GR127 GR32 GR0 NaT Stacked, Rotating Static 0 Integer Registers 630 Predicate Registers Rotating Static 1 PR1 PR63 PR0 PR15 PR16 bit FR0 FR1 FR2 FR31 FR32 FR FP Registers
Optimization of applications for Intel* platforms Регистровый стек 32 Outputs Local (Inputs) Outputs Local (Inputs) Outputs Local (Inputs) PROC B PROC A CallAllocRet Virtual Каждая процедура заказывает себе требуемое ей количество стековых регистров командой alloc Каждая процедура заказывает себе требуемое ей количество стековых регистров командой alloc Кадр предоставляемых регистров делится на три части: Inputs, Local, Outputs Кадр предоставляемых регистров делится на три части: Inputs, Local, Outputs Outputs является Inputs для вызываемой процедуры Outputs является Inputs для вызываемой процедуры
Optimization of applications for Intel* platforms Порты и исполнительные устройства Порт – устройство, через которое инструкция достигает исполняющего устройства M-порт – для команд обмена данными с кэш, арифметических и логических операций Itanium2 – M0, M1, M2, M3 I-порт – для команд арифметических и логических операций, операций сдвига I0, I1 B-порт - для команд переходов B0, B1, B2 F-порт – для команд с операндами - числами с плавающей точкой F0, F1 Исполнительные устройства 1 устройство взаимодействия с кэшами 3 устройства переходов 4 устройства обработки чисел с плавающей запятой 17 устройств работы с целочисленными данными
Optimization of applications for Intel* platforms Бандл (bundle) Бандл (16 байт) – единица двоичного исполняемого кода, содержит группу из трех команд и поле шаблона (template) 1 бандл = 128 бит 3 инструкции в бандле по 41 биту (слоты) типы слотов соответствуют типам портов (M, I, F, B) и определяются шаблоном Граница группы инструкций определяется stop битом или шаблоном Instruction 2Instruction 1 Instruction 0dispersal template 4 bits stopstop 128 bits (bundle) 41 bits
Optimization of applications for Intel* platforms Кэш 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 Таблица ранних загрузок
Optimization of applications for Intel* platforms Обзор системы команд Команда alloc Команды обмена данными Арифметические и логические команды Команды сравнения Команды сдвига Команды обработки данных с плавающей точкой Команды параллельной обработки Команды переходов Влияние предикатов на команду
Optimization of applications for Intel* platforms Формат инструкций (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 )
Optimization of applications for Intel* platforms Обзор системы команд. Команда alloc Должна стоять первой в вызываемой функции Формат alloc R1 = i, l, o, r в регистр R1 копируется регистр состояния предыдущей функции, обычно, его можно не сохранять (и не восстанавливать), если в функции регистр состояния не изменяется i – количество передаваемых в функцию целочисленных и адресных параметров l – количество локальных переменных (нестатических стековых регистров), которые будут использоваться в функции o – количество передаваемых целочисленных и адресных параметров для функции, которая будет вызываться из данной функции r – количество нестатических стековых целочисленных регистров, которые будут вращаться, r – кратно 8 общее количество задействованных нестатических стековых регистров s = i + l + o; r
Optimization of applications for Intel* platforms Обзор системы команд. Команды обмена данными 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 – выгружает из регистра данных с плавающей точкой в память в соответствующем формате
Optimization of applications for Intel* platforms Обзор системы команд. Команды обмена данными ldX.a ранняя загрузка ldX.c спекулятивная загрузка
Optimization of applications for Intel* platforms Обзор системы команд. Команды обмена данными Команда MOV – копирует данные из одного регистра в другой mov r1 = r2 – псевдокоманда; реально ассемблер превращает ее в команду add r1 = r0, r2, про это полезно помнить mov f1 = f2 – тоже псевдокоманда, которая реально превращается в fmerge f1 = f2, f2, что тоже полезно помнить, т.к. fmerge исполняется только в устройстве F0 Команды setf, getf – позволяют передавать данные из регистров общего назначения в регистры данных с плавающей точкой и обратно
Optimization of applications for Intel* platforms Обзор системы команд. Арифметические и логические команды add, sub, and, or, xor и т.п. – естественно, присутствуют shladd r1 = r2, n, r3 – операнд из r2 сдвигается влево на n разрядов (n=1-4), к результату прибавляется операнд из r3 и полученная сумма помещается в r1
Optimization of applications for Intel* platforms Обзор системы команд. Команды сравнения 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
Optimization of applications for Intel* platforms Обзор системы команд. Команды сдвига shr, shl r1 = r2, r3 – сдвигает содержимое регистра r2 в соответствующем направлении и помещает в регистр r1; на сколько – указано в регистре r3; может выполняться в I0 и I1 устройствах shr, shl r1 = r2, n – сдвигает содержимое регистра r2 в соответствующем направлении на n разрядов и помещает в регистр r1; псевдокоманда – реализуется через команды extr, и как следствие, может выполняться только в I0
Optimization of applications for Intel* platforms Обзор системы команд. Команды обработки данных с плавающей точкой fma, fms, fnma f1 = f2, f3, f4 – основные команды вычислений; по порядку: умножает и складывает, умножает и вычитает, умножает и выполняет обратное вычитание fmax, fmin – мнемоника все обясняет frcpa, frsqrt – вычисляют обратную величину и обратный квадратный корень с относительной точностью 2**-8; первое приближение для итерационных вычислений fmerge – собирает от разных операндов знак, порядок, мантиссу и формирует новое число; на fmerge опирается много псевдокоманд, например fabs fand, for, fxor – выполняют побитовые логические операции над операндами из регистров данных с плавающей точкой fcvt – выполняет преобразование целочисленных данных в числа с плавающей точкой и в обратную сторону Другие
Optimization of applications for Intel* platforms Обзор системы команд. Команды параллельной обработки Параллельные команды для регистров общего назначения. Эти команды обращаются к регистрам общего назначения как к 2-ум двойным словам, 4-ем словам или 8-ми байтам, причем как к числам со знаком, так и без знака padd, psub, pmpy, pmax, pmin, pcmp, pshl, pshr – мнемоника команд все сообщает pshladd, pshradd, pmpyshr – те же арифметические действия, но еще присутствует сдвиг pack, unpack, mix, mux – команды упаковки/распаковки данных и изменения позиции в регистре Параллельные команды для обработки данных с плавающей точкой. Рассматривают 64 бита регистра как два 32-разрядных числа с плавающей точкой. fpmpa, fpms, - арифметические действия fpack, fswap – команды упаковки, изменения позиции в регистре
Optimization of applications for Intel* platforms br label – переход на метку; на самом деле в коде указывается смещение относительно счетчика команд, оно должно укладываться в 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 – тоже варианты последней команды цикла. Данные команды позволяют организовать цикл с программным конвейером. Обзор системы команд. Команды переходов
Optimization of applications for Intel* platforms Обзор системы команд. Влияние предикатов на команду Почти все команды имеют поле для указания на предикатный регистр. По умолчанию команде соответствует регистр p0 (p0==1) Команда выполняется только в том случае, если соответствующий ей предикатный регистр установлен в 1, иначе команда не исполняется (p8) add r1 = r2, r3 Механизм предикатов позволяет избавляться от ветвлений, и как следствие, уменьшить число промахов при переходах. Также механизм предикатов позволяет реализовать программный конвейер.
Optimization of applications for Intel* platforms Q&A
Optimization of applications for Intel* platforms Thank you.