64 «кусочка» из Калифорнии: обзор архитектуры AMD64
реклама
Эта работа принимает участие в нашем конкурсе статей.
"Кусочек", "частица" - так, дословно,
переводится с английского слово "bit".
Впервые о "64-битности" заговорили еще во времена первого Pentium (1993). Однако вскоре выяснилось, что 64-битной стала шина данных, тогда как логика самого процессора осталась 32-битной. Новый интерес к 64-битной архитектуре возник после анонса процессора Merced (1997), представленного в конце 1999 года под торговой маркой Itanium. К сожалению, существующие 32-битные программы работали на нем медленнее Celeron'а, стоящего, к тому же, в несколько раз дешевле. Это поставило крест на домашнем и офисном применении Itanium'а. Но время шло, и вот "магические" 64 бита опять на слуху. На сей раз виновником торжества стала архитектура AMD64 и основанные на ней процессоры: Athlon 64, Athlon FX и Opteron. Новые процессоры имеют много нововведений, отличающих их от своего предшественника, Athlon XP. Это и интегрированный контроллер памяти, и новая шина, и многое другое. В этой статье мы рассмотрим их главную особенность - 64-битную архитектуру. Итак, что же она из себя представляет?
РЕГИСТРЫ
реклама
В AMD64 к имеющимся регистрам было добавлено несколько новых регистров, а существующие - расширены. Наиболее кардинальные изменения произошли в регистрах общего назначения (РОН), регистрах SSE и регистре указателя инструкций. Все они, за исключением регистров SSE, стали 64-битными. Прежние 32-битные РОНы теперь входят в состав новых 64-битных РОНов в качестве младших частей. Кроме того, добавлено еще 8, действительно новых, регистров общего назначения R8-R15, аналогов которых в x86-процессорах просто не было. Впервые за 25 лет существования архитектуры было увеличено число РОНов, и не просто так, а вдвое! Нововведение сулит заметный рост производительности, конечно, при условии использования соответствующих компиляторов.
Следующее по значимости расширение - увеличение числа регистров SSE. К регистрам XMM0-XMM7, появившимся в 1999 году в процессоре Pentium III, были добавлены новые регистры XMM8-XMM15. AMD показалось мало добавить поддержку SSE2. Она увеличила вдвое число регистров, и тем самым сделала свой SSE-блок потенциально более мощным, чем в процессоре Pentium 4! Ведь в нем по-прежнему только 8 регистров SSE (появление SSE2 означало появление новых инструкций, но не новых регистров). Фактически блок SSE2 в AMD64 представляет собой нечто большее, чем просто SSE2. Это уже своего рода "SSE2+", хотя корректнее было бы назвать его "SSE2 Double Register Set". Забавно, что AMD покусилась на родную "вотчину" Intel - расширения SSE, - перехватив пальму первенства в этой области. Но следует учесть, что мощность нового блока может раскрыться только в 64-битной системе при использовании 64-битных приложений. Поэтому не стоит делать скоропалительных выводов по результатам 32-битной версии "Сандры". Тем более, что синтетические тесты, по большому счету, обходятся всего 2-3 регистрами, тогда как реальные приложения могут использовать больше. Что касается регистра флагов, то расширен он пока с запасом на будущее: старшие 32 бит процессором не используются (всегда 0). Расширение регистра указателя инструкций потребовалось при переходе к 64-битной адресации. Новый регистр теперь называется RIP, и включает в качестве младшей своей части регистр EIP. Набор регистров математического сопроцессора x87 остался без изменений. Впрочем, AMD больше не рекомендует им пользоваться, советуя 64-битным программам целиком перейти на SSE2.
АДРЕСАЦИЯ
Основная причина перехода к 64-битной архитектуре состоит в том, чтобы дать программе больше 2 Гб памяти, т. е. преодолеть ограничение 32-битных систем (верхние 2 Гб адресов в Win32 зарезервированы для ядра и API-функций). Цены на память постоянно снижаются. Сегодня гигабайт стоит дешевле $200, а значит, например, установка 16 Гб памяти обойдется менее чем в $3200 (что для сервера вполне приемлемо). Как я уже говорил, в 32-битных операционных системах физическое адресное пространство ограничено объемом в 4 Гб, которое приходится, к тому же, делить между приложениями, библиотеками, и ядром системы. Реально Windows-приложениям доступно всего 2 Гб адресов (3 Гб в Windows 2000 Advanced Server при указании ключа /3GB в boot.ini, что, впрочем, накладывает некоторые ограничения). Потребности же многих приложений - баз данных, программ обработки растровой графики и видео, систем автоматизированного проектирования, скоро превысят этот лимит, т. к. оперируют все большими наборами данных.
Процессоры Intel начиная с Pentium Pro могут иметь и более 4 Гб физической памяти, но только через механизм PAE (Physical Address Extension) - "расширение физического адреса". Как Linux так и Windows 2000 Advanced Server способны задействовать эту память (вплоть до 64 Гб - это предел PAE), но приложения, увы, по-прежнему ограничены двумя гигабайтами адресного пространства. Предоставить доступ к большему пространству можно, но лишь используя специальные механизмы вроде AWE (Address Windowing Extensions) - "расширение адреса методом окна". Программирование с помощью AWE трудно само по себе, а главное, производительность при случайном доступе к памяти оказывается заметно ниже, чем при использовании плоской модели адресации. К тому же память, выделенная через AWE, не поддается свопингу и не может быть использована другими процессами. Небольшое отступление: во времена DOS был такой стандарт памяти - EMS (Expanded Memory Specification). Оригинальный IBM PC/XT мог иметь до 1 Мб физической памяти, EMS позволил ему иметь до 16 Мб, но не напрямую, а в виде "окна" в памяти размером 64 Кб, и набора банков отображаемых по очереди в это окно. Достигалось это применением специального драйвера и карты с памятью, вставляемой в слот расширения. На переключение банков тратилось значительное число тактов процессора (что, впрочем, все равно быстрее свопа на диск), зато таким образом преодолевалось ограничение 20-битной адресации IBM PC/XT. Избавиться от этих неудобств можно перейдя на новую адресацию.
Процессоры Athlon 64 и Opteron не полностью 64-битные. Да, для указателей в программах используются новые 64-битные регистры, но объем адресуемой памяти в 16 экзабайт (16*1048576 терабайт) 64-битной адресации показался AMD излишним (вполне справедливо). Поэтому нынешние процессоры используют 48-битную адресацию, и позволяют адресовать до 256 Тб виртуальной памяти. Старшие 16 бит 64-битного адреса пока не используются. Для задания физического адреса в адресной шине отведено и того меньше - 40 бит, что позволяет иметь до 1 Тб физической оперативной памяти. Однако сейчас трудно представить себе компьютер даже с подобным количеством памяти, тем более, что будущие версии процессоров AMD64 могут иметь и более широкую адресную шину. Системным программистам может быть интересно, как в новом процессоре осуществляется трансляция линейных адресов в физические:
реклама
Видно, что трансляция адреса стала четырехуровневой (в Pentium она была двухуровневой, в режиме PAE - трехуровневой). Для того чтобы компенсировать столь сложную процедуру, процессоры Athlon 64/FX и Opteron оснащены улучшенным блоком TLB (Translation-Lookaside Buffer). Блок TLB, иначе называемый кэшем страничной трансляции, используется при каждом обращении к памяти. Если соответствующий логический адрес уже был однажды преобразован в физический и информация об этом сохранилась в кэше, то обращение к памяти происходит моментально, минуя обращения к громоздким таблицам трансляций. Кэш TLB, также как и общий кэш процессора, является двухуровневым. У Athlon 64 он составляет 40 записей для инструкций, 40 для данных (L1) и 512 общих записей (L2), против 24 и 40 (L1), и 256 (L2) у Athlon XP.
А вот о следующем нововведении стоит рассказать особо. Скорость компьютера сильно зависит от нагрузки, приходящейся на каналы памяти. В типичном x86-коде около половины объема приходится на адреса операндов и связанные с ними константы, следовательно, двукратное увеличение разрядности адреса должно привести к увеличению объема кода примерно в 1.5 раза. Что в свою очередь означало бы пропорциональное увеличение нагрузки на шину данных и снижение эффективности кэша. Не говоря уже о такой "мелочи" как больший размер новых EXE- и DLL-файлов, а следовательно и большее потребление оперативной памяти. Иначе говоря, переход Athlon'а в 64-битный режим мог бы сопровождаться заметным падением производительности, примерно таким, какой произойдет при переходе с Athlon'а на равночастотный Duron.
Предвидя возникновение этой проблемы, инженеры добавили новый режим адресации относительно 64-битного указателя инструкций - RIP-relative addressing. Эффективный адрес в этом случае получается суммированием 32-битного адреса операнда, который играет роль смещения, и регистра RIP. Еще в 60-х годах было подмечено, что адреса, используемые в командах перехода имеют закон распределения близкий к нормальному, с вершиной в команде перехода:
Т. е. чем дальше адрес отстоит от текущего значения указателя инструкций, тем меньше вероятность его применения. Такой подход позволяет снизить разрядность адресов не только команд перехода, но и вообще всех команд использующих ModRM-адресацию. В те моменты, когда 32 бит все же не хватит, компилятор сформирует полный 64-битный адрес, после чего, по возможности, снова продолжит генерировать 32-битные адреса. Сам по себе этот режим адресации не нов, и так или иначе использовался в разных компьютерах (не x86), а с переходом x86 на новую адресацию он показал себя во всей красе, практически ликвидировав главный недостаток 64-битного кода - большой размер.
ВЫЧИСЛЕНИЯ
Операции над 64-битными числами ведутся в криптографических системах, в научных и финансовых задачах. Например, алгоритмы шифрации SSL используют 64-битное целочисленное умножение. Добиться этого одной инструкцией на 32-битной машине невозможно, а 64-битная архитектура иногда позволяет обойтись одной командой, как следствие - колоссальное снижение нагрузки вычислительных блоков процессора и размера кода (примерно в 10 раз). Наличие 64-битных регистров может ускорить алгоритмы побитовой обработки данных, например, кодирование Хаффмана, применяемое в MPEG-сжатии. Рассмотрим несколько примеров.
64-битное сложение в x86: |
00000000 03 C3 add eax, ebx |
00000002 13 D1 adc edx, ecx |
64-битное сложение в AMD64: |
00000000 48 03 C3 add rax, rbx |
Второй вариант короче на один байт, хотя и требует дополнительного префикса (48h). К тому же он не стирает содержимое регистров ECX, EDX и гарантированно выполняется за 1 такт процессора.
Функция 64-битного умножения в x86: |
x86_mul_64x64 proc near |
push ebp |
mov ebp, esp |
push ebx |
push esi |
push edi |
mov esi,[ebp+8] |
mov edi,[ebp+12] |
mov ecx,[ebp+16] |
push ebp |
mov [tempESP], esp |
mov eax,[esi] |
mov edx,[edi] |
mul edx |
mov ebx,edx |
mov [ecx],eax |
xor esp,esp |
xor ebp,ebp |
mov eax,[esi+4] |
mov edx,[edi] |
mul edx |
add ebx,eax |
adc ebp,edx |
adc esp,0 |
mov eax,[esi] |
mov edx,[edx+4] |
mul edx |
add ebx,eax |
adc ebp,edx |
adc esp,0 |
mov [ecx+4],ebx |
mov eax,[esi+4] |
mov edx,[edi+4] |
mul edx |
add ebp,eax |
adc esp,edx |
mov [ecx+8],ebp |
mov [ecx+12],esp |
mov esp, [tempESP] |
pop ebp |
pop edi |
pop esi |
pop ebx |
mov esp, ebp |
pop ebp |
ret |
x86_mul_64x64 endp |
Функция 64-битного умножения в AMD64: |
amd64_mul_64x64 proc near |
mov rax, [rcx] |
mul [rdx] |
mov [r8], rax |
mov [r8+8], rdx |
ret |
amd64_mul_64x64 endp |
Во втором варианте инструкций меньше в 9 раз! В пределе можно обойтись и вовсе одной командой mul r64, если, например, необходимые данные уже содержаться в регистрах процессора. При делении разница будет еще больше: для x86 придется писать функцию длиной в 60-80 ассемблерных строк (я не буду ее приводить, но поверьте мне на слово), а для AMD64 размер останется тем же. Кроме того, для AMD64 опять можно обойтись одной командой div r64.
Кстати, 64 бита - не предел. Бывают и большие числа. Операции над ними могут потребоваться при моделировании ядерных взрывов, исследовании генома человека, к тому же они представляют чисто научный интерес. По данным AMD, для умножения двух 1024-битных чисел нужны следующие действия:
32-битные компьютеры | 64-битные компьютеры | |
Число сложений | 255 | 63 |
Число сложений с переносом | 509 | 125 |
Число умножений | 256 | 64 |
Итого | 1020 инструкций | 252 инструкции |
реклама
Очевидно четырехкратное преимущество последних. Кстати Athlon 64 выполняет сложение и вычитание 64-битных чисел также быстро, как и 32-битных, а задержка при чтении их из памяти лишь немногим выше чем у 32-битных и с лихвой компенсируется меньшим размером кода.
До недавнего времени, поддержка 64-битной математики была только в высокопроизводительных серверах и дорогих рабочих станциях. Стоимость таких серверов на базе RISC-процессоров начиналась где-то с отметки в $25.000, а систем на базе Intel IA-64 от $10.000. Вот почему 64-битные сервера до сих пор составляли не более 5% всех серверов проданных на рынке. С приходом AMD64 ситуация может измениться - новые процессоры гораздо дешевле, но что еще важнее, они используют стандартные корпуса и комплектующие. Иначе говоря, с приходом Athlon 64/FX и Opteron 64-битные вычисления, наконец-то, могут пойти "в массы".
СОВМЕСТИМОСТЬ
Главный фактор, объясняющий удивительный успех архитектуры x86 - все поколения аппаратных средств сохраняли обратную совместимость с предыдущими. Это позволяло не спешить с "апгрейдом" и переходить к новым программам постепенно. Когда-то 386-й (1985) стал первым 32-битным x86-процессором. Но полной поддержки со стороны операционных систем не было в течение восьми лет, пока в 1993 не вышла Windows NT 3.1. По настоящему же массовой 32-битная архитектура стала после выхода Windows 95, т. е. спустя десять (!) лет. Поэтому поддержка 16-битного режима была очень важна для 386-го, иначе бы он не прижился на рынке. Кстати, главным козырем Windows 95 на тот момент была именно аппаратная поддержка программ MS-DOS и 16-битных Windows-программ, позволяя им работать на полной скорости вместе с 32-битными программами. AMD64 исповедует тот же принцип перехода к новым системам и приложениям.
AMD64 поддерживает работу как старых, 32-битных, так и новых, 64-битных, приложений, сосуществующих под 64-битной операционной системой. Причем, 32-битные приложения работают на полной скорости исполняясь аппаратными средствами, без эмуляции (в отличии от IA-64 архитектуры). Кроме того, процессор полностью совместим со старыми системами. Можно купить 64-битный компьютер и поставить на него 32-битную Windows 98/XP или даже Windows 3.1, используя его как быстрый Pentium, сохранив все старые приложениях и операционные системы. Позднее можно мигрировать на новую ОС с поддержкой 64-битных приложений и воспользоваться всеми преимуществами архитектуры.
Для реализации совместимости старых приложений с новыми AMD64 предлагает 2 режима: Long Mode ("длинный" режим) и Legacy Mode (унаследованный режим). В свою очередь, Long Mode состоит из 2 подрежимов: 64-bit Mode и Compatibility Mode. В 64-bit Mode раскрывается весь потенциал архитектуры: доступны новые регистры и 64-битное адресное пространство. Но приложение и сопутствующие dll-ки должны быть откомпилированы заново. Режим Compatibility Mode существуют для запуска старых 32-битных приложений из под новой 64-битной операционной системы. Для этих приложений все выглядит так, как если бы они работали на обычном x86-процессоре. Ну и Legacy Mode это не что иное, как старые-добрые режимы работы x86 (Protected Mode, Virtual 8086 Mode, Real Mode). Именно в Legacy Mode работают 32-битные Windows 9X/ME/NT/2K/XP.
Большинство 64-битных операционных систем будут поддерживать Compatibility Mode. Но вызов системной функции, сделанный в 64-битной среде 32-битным приложением, нуждается в преобразовании некоторых аргументов, в основном, указателей адреса. "Прослойка", выполняющая на лету подобные преобразования, является важной частью системы. Windows реализует ее через подсистему "Windows on Windows". Специальная библиотека, wow.dll, динамически подключается ко всем 32-битным приложениям и выполняет следующие функции:
- Приводит аргументы к 64-битному виду
- Передает управление (вызов) 64-битному ядру
- Приводит результаты вызова обратно к 32-битному виду
- Возвращает их приложению
Преобразования не столь накладны, как кажутся, большинство из них сводятся к добавлению нулей к аргументам функции и к их последующему удалению. К счастью, системные вызовы случаются все же не так часто, весь остальной код работает без посредников. Кроме того, это небольшое отставание может частично компенсироваться ростом скорости самой операционной системы, т. е. системных библиотек и драйверов, за счет использования новых регистров.
Способность выполнять одновременно 32-битные и 64-битные приложения особенно ценна для программистов. При разработке 64-битных приложений, они могут пользоваться 32-битным инструментарием на той же машине, на которой отлаживают 64-битный код. Можно оставить любимые 32-битные редакторы/утилиты, которые, возможно, никогда не будут перенесены на новую ОС. 32-разрядная совместимость позволит разрабатывать и проверять код на той же машине, без перезагрузки.
ИТОГИ
Впервые с момента появления набора команд 3DNow! (1998) AMD предложила принципиально новое расширение (да еще какое!), отняв при этом инициативу у главного конкурента - корпорации Intel. А как, кстати, дела у нее? Не сегодня-завтра 64-битные процессоры выпускать все равно придется - память дешевеет и через пару лет несколько гигабайт памяти в компьютере никого не удивят, не говоря уже о потенциально более быстром коде 64-битных приложений. Intel наверняка придется выпускать свое 64-битное расширение. Вопрос только в том, как они его реализуют.
Для пользователей и программистов, наверное, будет лучше если Intel лицензирует AMD64. Эта архитектура вышла довольно удачной, прошла некоторую проверку временем, и знакома программистам. Но пойдут ли в Intel на такой компромисс? Чужие команды в "пентиумах" - такого в истории корпорации еще не случалось. "Pentium 4 с поддержкой технологии AMD" - звучит забавно. :-) Теоретически Intel может попробовать переманить разработчиков софта на свою архитектуру, несовместимую с AMD64. Но практически осуществить это с каждым пройденным днем неясности все сложнее. Еще несколько месяцев и уже никакие деньги Intel не помогут. Да и Microsoft пока благоволит AMD. Intel слишком долго "темнила" об имеющихся наработках в этой области, чем вызвала недоумение софтверного гиганта. "Когда же, наконец, мы будем МАССОВО продавать 64-битные Windows/Office? Очередной графической "рюшечкой" народ уже на завлечешь, а продавать-то надо!".
Сейчас проблема Intel даже не в том, есть ли у нее эти расширения, а в том, что она их до сих пор не опубликовала. Ведь для того, чтобы разработать компилятор, портировать ОС класса Windows и все драйвера на новую архитектуру, не забыв протестировать при этом, нужно несколько лет! Время упущено. А первые наброски архитектуры AMD опубликовала еще в 2001 году и программисты изучили ее за это время, подготовившись к появлению процессоров с их поддержкой. Поддержка AMD64 обещана в будущей версии Windows. Более того, имеется уже сейчас в экспериментальной Windows XP 64-bit Edition for Extended Systems. Имеется и поддержка компилятором Visual C++, справочной службой MSDN, т.е. информация об AMD64 входит в состав Platform SDK и доступна Win-программистам. Даже если Intel сейчас, вдруг, продемонстрирует собственное расширение, кардинально отличающееся от AMD, то версию Windows, использующую ее, мы увидим очень не скоро (если вообще увидим!). Единственный, мне кажется, выход для Intel - все-таки лицензировать расширение AMD64, но возможно, под другой торговой маркой. Так или иначе, как поступит Intel пока неизвестно и остается лишь гадать о развитии ситуации.
При подготовке статьи использованы материалы:
- AMD Athlon 64 Processor Data Sheet
- The AMD64 ISA Value Proposition
- AMD64 Architecture Programmer's Manual Volume 1-5
- Porting Applications to Windows for AMD64 Technology
- Software Optimization Guide for AMD Athlon 64 and AMD Opteron Processors
Напоследок небольшой сюрприз. Мне на глаза попалась вот эта новость. Интересно, если это действительно так, то прерогативы Intel могут сильно измениться и скоро она, быть может, сфокусируется на другой рынок (кстати, тоже весьма денежный) - устройства коммуникации.
реклама
Лента материалов раздела
Соблюдение Правил конференции строго обязательно!
Флуд, флейм и оффтоп преследуются по всей строгости закона!
Комментарии, содержащие оскорбления, нецензурные выражения (в т.ч. замаскированный мат), экстремистские высказывания, рекламу и спам, удаляются независимо от содержимого, а к их авторам могут применяться меры вплоть до запрета написания комментариев и, в случае написания комментария через социальные сети, жалобы в администрацию данной сети.
Сейчас обсуждают