Что собой представляет адресация и распределение памяти в архитектуре amd64

Обновлено: 17.05.2024

AMD64 (также x86-64 или x64) — 64-битная архитектура микропроцессора и соответствующий набор инструкций, разработанные компанией AMD. Это расширение архитектуры x86 с полной обратной совместимостью. Набор инструкций x86-64 в настоящее время поддерживается процессорами AMD Athlon 64, Athlon 64 FX, Athlon 64 X2, Turion 64, Opteron, последними моделями Sempron. Интересно, что этот набор инструкций был поддержан основным конкурентом AMD — компанией Intel под названием EM64T или IA-32e в поздних моделях процессоров Pentium 4, а также в Pentium D, Pentium Extreme Edition, Celeron D, Core 2 Duo и Xeon. Корпорация Microsoft использует для обозначения этого набора инструкций термин x64.

Процессоры архитектуры поддерживают два режима работы: Long mode («длинный» режим) и Legacy mode (режим совместимости с x86).

Long Mode
Legacy Mode

Данный режим позволяет процессору AMD64 выполнять инструкции, рассчитанные для процессоров x86, и предоставляет полную —совместимость с 32/16-битным кодом и операционными системами. В этом режиме процессор ведёт себя точно так же, как x86-процессор, например Pentium 4, и дополнительные функции, предоставляемые архитектурой AMD64 (например, дополнительные регистры) недоступны. В этом режиме 64-битные программы и операционные системы работать не будут.

Особенности архитектуры

Архитектура x86_64 имеет

16 целочисленных 64-битных регистра общего назначения (RAX, RBX, RCX, RDX, RBP, RSI, RDI, RSP, R8 — R15), 8 64-битных регистров Multimedia Extensions (MM0 — MM7, имеют общее пространство с регистрами ST0 — ST7) 64-битный указатель RIP и 32-битный регистр флагов EFLAGS


Opteron (кодовое название Sledgehammer или K8) — первый микропроцессор фирмы AMD, основанный на 64-битной технологии AMD64 (также называемой x86-64). AMD создала этот процессор в основном для применения на рынке серверов, поэтому существуют варианты Opteron для использования в системах с 1-16 процессорами.


В июне 2004 года в Top500 суперкомпьютеров десятое место занял Dawning 4000A — китайский суперкомпьютер построенный на процессорах Opteron. В ноябре 2005 он опустился на 42 место, в связи с появлением более производительных конкурентов. Тогда в ноябрьском Top500 10 % суперкомпьютеров были построены на базе процессоров AMD64 Opteron. Для сравнения, на базе процессоров Intel EM64T Xeon были построены 16.2 % суперкомпьютеров. Две ключевые особенности

Двумя важными технологиями воплощёнными в процессоре Opteron являются: Прямая (без эмуляции) поддержка 32-битных x86 приложений без потери скорости Прямая (без эмуляции) поддержка 64-битных x86-64 приложений (линейная адресация более 4 ГБ ОЗУ)

Первая технология примечательна тем, что во время анонса процессора Opteron единственным 64-битным процессором с заявленной поддержкой 32-битных x86 приложений был Intel Itanium. Но Itanium выполнял 32-битные приложения со значительной потерей скорости.

Вторая технология, сама по себе не так примечательна, так как основные производители RISC процессоров (SPARC, DEC, HP, IBM, MIPS и другие) имели 64-битные решения уже много лет. Но совмещение в одном продукте этих 2-х свойств, напротив, принесло Opteron признание, так как он предлагал доступное и экономичное решение для запуска существующих x86 приложений с последующим переходом на более перспективные 64-битные вычисления.

Процессоры Opteron имеют интегрированный контроллер памяти DDR SDRAM. Это позволило существенно уменьшить задержки при обращении к памяти и исключить необходимость в отдельном чипе северного моста на материнской плате.

В мае 2005 года AMD представила первый «многоядерный» процессор Opteron. В настоящее время термин «многоядерный» компания AMD использует для обозначения «двухъядерных» процессоров; в каждом процессоре Opteron размещено 2 отдельных процессорных ядра. Это фактически удваивает вычислительную мощность доступную каждому процессорному разъёму на материнских платах, поддерживающих эти процессоры.

amdathlon_fx_x2.jpg

Одним из “топовых” процессоров AMD сегодня считается - Athlon X2 6000+ на ядре Windsor под сокет AM2. Этот процессор содержит два ядра Athlon 64, объединённых на одном кристалле с помощью набора дополнительной логики. Ядра имеют в своём распоряжении двухканальный контроллер памяти, базирующийся на Athlon 64 степпинга E, и в зависимости от модели, от 512 до 1024 КБ КЭШа 2-го уровня на каждое ядро. Athlon 64 X2 поддерживают набор инструкций SSE3 (которые ранее поддерживались только процессорами компании Intel), что позволило запускать с максимальной производительностью код, оптимизированный для процессоров Intel. Эти улучшения не уникальны для Athlon 64 X2 и так же имеются в релизах процессоров Athlon 64, построенных на ядрах Venice и San Diego. AMD официально начала поставки Athlon 64 X2 на выставке Computex 1 июня 2005 года.

athlon64_x2.jpg

Основным преимуществом, которое даёт двуядерные процессоры Athlon 64 X2 является возможность разделения запущенных программ на несколько одновременно выполняемых потоков. Способность процессора выполнять одновременно несколько программных потоков называется параллелизм на уровне потоков (thread-level parallelism или (TLP)). При размещении двух ядер на одном кристале, Athlon 64 X2 обладает двойным TLP по сравнению с одноядерным Athlon 64 при той же скорости. Необходимость в TLP зависит от конкретной ситуации в большей степени и в некоторых ситуациях она просто бесполезна. Большинство программ написаны с расчётом на работу в однопоточном режиме, и поэтому просто не могут задействовать вычислительные мощности второго ядра. Программы, написанные с учётом работы в многопоточном режим и способные использовать вычислительные мощности второго ядра, включают в себя множество приложений для обработки музыки и видео. Имея два ядра, Athlon 64 X2 обладает увеличенным количеством транзисторов на кристалле. Процессор Athlon 64 X2 с 1МБ КЭШа 2-го уровня имеет 233.2 миллиона транзисторов [1], в отличие от Athlon 64, имевшего всего 114 миллиона транзисторов [2]. Такие размеры требуют использования для производства более тонкого технологического процесса, который позволяет добиться выхода необходимого количества исправных процессоров с одной кремневой пластины. Athlon 64 X2 построен на ядрах: Toledo; Manchester; Windsor по 90 нм техпроцессу. Совсем недавно компания AMD официально представила свою новую платформу для настольных ПК под кодовым названием AMD Spider.

Платформа Spider

Состав платформы Spider

amdspider_platform.jpg

amdphenom.jpg

Основным компонентом данной платформы является процессор линейки AMD Phenom, совместно с чипсетом семейства AMD 7-Series.

Платформа AMD Spider: общие характеристики

Представляя вниманию широкой публике новые технологии, AMD делает акцент именно на платформенном характере инноваций. Ключевым компонентом платформы Spider являются многоядерные процессоры AMD Phenom (вплоть до 4-ядерных), выполненные с соблюдением норм 65 нм техпроцесса и предназначенные для работы с системными платами, оснащёнными разъёмом Socket AM2+. Помимо этого, в состав платформы Spider входит новое поколение чипсетов AMD 7 Series для создания системных плат с поддержкой технологий CrossFireX и AMD OverDrive, а также графика семейства ATI Radeon HD 3800 с поддержкой Microsoft DirectX 10.1.

Схема платформы AMD Spider

amdspider-architecture.jpg

Если отбросить в сторону многословие пресс-релизов, основной инновацией, реализованной в платформе AMD Spider, можно назвать значительное повышение параметра “производительность на ватт”, главным образом, за счёт энерго-эффективного дизайна 65 нм процессоров AMD Phenom, 65 нм чипсетов AMD 7-Series и 55 нм графических чипов семейства ATI Radeon HD 3800. Наряду с этим, платформа AMD Spider обладает поддержкой ряда специфических технологий экономии энергии: ATI PowerPlay, Cool’n’Quiet 2.0, Microsoft DirectX 10.1, HyperTransport 3.0 и PCI Express 2.0. В частности, технология Cool’n’Quiet 2.0 позволяет снижать энергопотребление процессоров AMD Phenom, обладающих TDP 95 Вт, до средних 32 Вт в бытовых и средних 29 Вт в коммерческих приложениях. В то же время технология AMD CoolCore, реализованная в чипсетах AMD 7-Series, обеспечивает работу ядер процессора на разных частотах и, соответственно, снижение энергопотребления, при этом TDP чипсетов в среднем составляет порядка 10-12 Вт.

Другая инновация платформы AMD Spider – значительная её масштабируемость, беспрецедентная для решений на базе процессоров AMD. Так, системные платы на базе чипсетов AMD 7-Series, благодаря технологии ATI CrossFireX и поддержке до 42 линий PCI Express, обладают возможностью работы с тремя или четырьмя графическими картами ATI Radeon HD 3800. С точки зрения микроархитектуры процессоров AMD, новые чипы 4-ядрные чипы Phenom для настольных ПК, выполненные на базе архитектуры Stars (ядро Agena), являются “ближайшими родственниками” новых 4-ядерных серверных процессоров AMD Opteron на базе ядра Barcelona.

Каждое из четырёх ядер процессора Phenom обладает собственным 64 Кб собственной кэш-памяти L1 для инструкций и 64 Кб кэш-памяти L1 для данных, что в сумме составляет 512 Кб кэш-памяти L1 на процессор. Суммарный объём кэш-памяти L2 составляет 2 Мб, по 512 Кб на каждое ядро. Помимо этого, архитектуры Barcelona и Stars подразумевают наличие 2 Мб кэш-памяти L3. В отличие от кэш-памяти уровней L1 и L2, эксклюзивных для каждого ядра, кэш-память L3 динамически распределяется между всеми ядрами.

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

Новые чипсеты AMD 7 Series для настольных ПК
Ключевые характеристики чипсетов AMD 7 Series
Чипсет AMD 790FX AMD 790X AMD 770
HyperTransport 3.0 + + +
PCI Express Gen. 2.0 + + +
Слотов под видеокарты До 4 До 2 1
GPU-Plex Technology + + -
Quad PCIE Blocks + + -
ATI CrossFireX Technology + + -
Обратная совместимость + + +

Согласно информации, полученной от источника из среды тайваньских производителей системных плат, компания AMD на днях известила своих партнеров о намерении начать отгрузку трехъядерных процессоров Phenom X3 (Toliman) уже в феврале 2008 года, а не в марте, как планировалось ранее. Двухъядерные процессоры Kuma появятся только в конце второго квартала будущего года.

Напомним, что первые трехъядерные процессоры, модели 7700 и 7600, будут работать на частотах 2,5 ГГц и 2,3 ГГц, соответственно, тепловыделение моделей установлена в 89 Вт. Тактовые частоты процессоров Kuma, моделей 6250 и 6050, пока не называются, известно лишь, что их TDP будет на уровне 65 Вт.

Эта работа принимает участие в нашем конкурсе статей.

"Кусочек", "частица" - так, дословно,
переводится с английского слово "bit".

реклама

Впервые о "64-битности" заговорили еще во времена первого Pentium (1993). Однако вскоре выяснилось, что 64-битной стала шина данных, тогда как логика самого процессора осталась 32-битной. Новый интерес к 64-битной архитектуре возник после анонса процессора Merced (1997), представленного в конце 1999 года под торговой маркой Itanium. К сожалению, существующие 32-битные программы работали на нем медленнее Celeron'а, стоящего, к тому же, в несколько раз дешевле. Это поставило крест на домашнем и офисном применении Itanium'а. Но время шло, и вот "магические" 64 бита опять на слуху. На сей раз виновником торжества стала архитектура AMD64 и основанные на ней процессоры: Athlon 64, Athlon FX и Opteron. Новые процессоры имеют много нововведений, отличающих их от своего предшественника, Athlon XP. Это и интегрированный контроллер памяти, и новая шина, и многое другое. В этой статье мы рассмотрим их главную особенность - 64-битную архитектуру. Итак, что же она из себя представляет?

MSI RTX 3070 сливают дешевле любой другой, это за копейки Дешевая 3070 Gigabyte Gaming - успей пока не началось

Основная причина перехода к 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. Избавиться от этих неудобств можно перейдя на новую адресацию.

реклама

Видно, что трансляция адреса стала четырехуровневой (в 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 пока неизвестно и остается лишь гадать о развитии ситуации.

При подготовке статьи использованы материалы:

  1. AMD Athlon 64 Processor Data Sheet
  2. The AMD64 ISA Value Proposition
  3. AMD64 Architecture Programmer's Manual Volume 1-5
  4. Porting Applications to Windows for AMD64 Technology
  5. Software Optimization Guide for AMD Athlon 64 and AMD Opteron Processors

Напоследок небольшой сюрприз. Мне на глаза попалась вот эта новость. Интересно, если это действительно так, то прерогативы Intel могут сильно измениться и скоро она, быть может, сфокусируется на другой рынок (кстати, тоже весьма денежный) - устройства коммуникации.

В статье кратко рассматривается архитектура AMD64 компании AMD и ее реализация EM64T компании Intel. Описаны особенности архитектуры, ее возможности, достоинства и недостатки.

Введение

Развитие задач, решаемых с помощью вычислительной техники, постоянно повышает требования к аппаратуре, на которой эти задачи решаются. Требования к вычислительным системам класса персональных компьютеров увеличиваются уже более 20 лет год от года. Это происходит из-за желания людей решать на персональных компьютерах все более сложные задачи, которые ранее решались лишь на высокопроизводительных мэйнфреймах.

Какие же требования возникают к персональным компьютерам для решения сложных задач? Разумеется, это требования по объему оперативной памяти и быстродействию процессора (не путать с частотой!). Господствующая последнее десятилетие архитектура IA32 (Intel Architecture 32) предлагает 4Гб (2^32) оперативной памяти, из которой приложению обычно доступно только 2Гб, различные блоки регистров, а также наборы ухищрений типа блока предсказания переходов, которые должны повысить производительность системы без повышения такого абстрактного параметра как частота процессора [1].

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

Решением проблемы ограничений современных 32-битных машин в какой-то степени стало появление 64-битных архитектур SPARC64 и Intel Itanium. Однако они предназначены для hi-end систем и недоступны в качестве дешевых решений. По настоящему массовыми предназначено стать архитектуре AMD64 компании AMD и ее реализации EM64T компании Intel. Эти архитектуры являются близнецами и программы, скомпилированные для одной из них, запускаются и на другой. Однако исторически первой появилось именно решение от AMD. EM64T является всего лишь фактически реализацией AMD64 от Intel. Архитектура AMD64 в настоящее время реализована в процессорах всех классов: мобильных, рабочих станциях, серверах.

Несмотря на явные преимущества платформы AMD64 (о которых подробно говорится в представленной статье), ничего революционно нового в вычислительной технике она не несет. Переход от 32-х бит к 64-м не привел к качественным улучшениям, в то время как прошлый подобный переход от 16-ти к 32-битам заметно повысил надежность и производительность систем.

1. Архитектура AMD64

Архитектура AMD64 полностью описывается в пяти томах документации, предоставляемой компанией AMD. В этой главе представлен краткий обзор, основанный на первом томе [2]. Обратим внимание на то, что в официальной документации данная архитектура обозначается как AMD x86-64, что подчеркивает ее обратную совместимость.

1.1. Описание архитектуры

Архитектура AMD x86-64 простое, но в то же время мощное обратно-совместимое расширение устаревшей промышленной архитектуры x86 [1]. Она добавляет 64-битное адресное пространство и расширяет регистровые ресурсы для поддержки большей производительности для перекомпилированных 64-битных программ, обеспечивая поддержку устаревшего 16-битного и 32-битного кода приложений и операционных систем без их модификации или перекомпиляции.

Необходимость 64-битной x86 архитектуры определяется приложениями, которым необходимо большое адресное пространство. Это высокопроизводительные серверы, системы управления базами данных, CAD-системы и конечно игры. Такие приложения получат преимущество от 64-битного адресного пространства и увеличения количества регистров. Малое количество регистров, доступное в устаревшей x86 архитектуре ограничивает производительность в вычислительных задачах. Увеличенное количество регистров обеспечивает достаточную производительность для многих приложений.

Архитектура x86-64 вводит две новые особенности:

1. расширенные регистры (рисунок 1):

2. специальный режим "Long Mode" (устоявшегося перевода пока нет), который представлен в таблице 1:

  • до 64-бит виртуальных адресов;
  • 64-битные указатель команд (RIP);
  • плоское (flat) адресное пространство.

a0029_amd64_em64t_ru/image1.jpg

Рисунок 1. Набор регистров x86-64

a0029_amd64_em64t_ru/image3.jpg

Таблица 1. Режимы работы процессора

Таблица 2 содержит сравнение ресурсов регистров и стека, доступных приложению в различных режимах. Левые колонки показывают ресурсы устаревшей x86 архитектуры, которые доступны только для совместимости. Правые колонки показывают ресурсы доступные в 64-битном режиме. Серым цветом показано отличие между режимами.

a0029_amd64_em64t_ru/image5.jpg

Таблица 2. Регистры и стек, доступные в различных режимах

Как показано в таблице 2, устаревшая архитектура x86 (такой режим называется legacy mode в x86-64) поддерживает 8 регистров общего назначения. Однако в действительности, в основном, используются лишь 4 регистра EAX, EBX, ECX, EDX. Регистры EBP, ESI, EDI, ESP имеют специальное назначение. Архитектура x86-64 добавляет 8 новых регистров общего назначения и увеличивает размер регистров с 32-х до 64-х бит. Это позволяет компиляторам повышать производительность кода. 64-битный компилятор может лучше использовать регистры для хранения переменных. Компилятор также может минимизировать обращения к памяти, локализуя работу внутри регистров общего назначения.

Архитектура x86-64 поддерживает весь набор инструкций x86 и добавляет некоторые новые инструкции для поддержки long-режима. Команды разбиты на несколько подмножеств:

Некоторые из этих команд соединяют два или более подмножества описанных выше команд. Например, это команды пересылки данных между регистрами общего назначения и XMM или MMX регистрами.

Рассмотрим более подробно представленные в таблице 1 режимы работы, поддерживаемые архитектурой x86-64. В большинстве случаев размеры адресов и операндов могут быть перекрыты префиксом команды.

Сначала опишем long-режим. Это расширение устаревшего защищенного (protected) режима. Long-режим состоит из двух подвидов: 64-битный режим и режим совместимости. 64-битный режим поддерживает все новые возможности и регистровые расширения, введенные в x86-64. Режим совместимости поддерживает бинарную совместимость с существующим 16-битным и 32-битным кодом. Long-режим не поддерживает устаревший реальный (real) режим или устаревший виртуальный (virtual-8086) режим, а также не поддерживает аппаратное переключение задач.

Поскольку 64-битный режим поддерживает 64-битное адресное пространство, то для его работы необходимо использовать новую 64-битную операционную систему. Существующие приложения при этом могут запускаться без перекомпиляции в режиме совместимости под операционной системой, работающей в 64-битном режиме. Для 64-битной адресации команд используется 64-битный регистр (RIP) и новый режим адресации с единым плоским (flat) адресным пространством и единым пространством для кода, стека и данных.

64-битный режим реализует поддержку расширенных регистров через новую группу префиксов команд REX.

В 64-битном режиме размер адресов по умолчанию 64 бита, однако реализации x86-64 могут иметь меньший размер. Размер операнда по умолчанию 32 бита. Для большинства инструкций размер операнда по умолчанию может быть перекрыт с использованием префикса команд типа REX.

64-битный режим обеспечивает адресацию данных относительно 64-битного регистра RIP. x86 архитектура обеспечивала адресацию относительно IP регистра только в командах передачи управления. RIP-относительная адресация повышает эффективность позиционно-независимого кода и кода, который адресует глобальные данные.

Несколько кодов операций (opcode) команд были переопределены для поддержки расширенных регистров и 64-битной адресации.

Режим совместимости предназначен для выполнения в 64-битной операционной системе существующих 16-битных и 32-битных программ. Приложения запускаются в режиме совместимости с использованием 32- или 16-битного адресного пространства и могут иметь доступ к 4Гб виртуального адресного пространства. Префиксы команд могут переключать 16- и 32-битные адреса и размеры операндов.

С точки зрения приложения, режим совместимости выглядит как устаревший защищенный режим x86, однако с точки зрения операционной системы (трансляция адресов, обработки прерываний и исключений) используются 64-битные механизмы.

Устаревший (legacy) режим обеспечивает бинарную совместимость не только с 16- и 32-битными приложениями, но и с 16- и 32-битными операционными системами. Он включает в себя три режима:

  • Защищенный (protected) режим. Поддерживаются 16- и 32-битные программы с сегментной организацией памяти, поддержкой привилегий и виртуальной памяти. Адресное пространство - 4Гб.
  • Виртуальный (virtual-8086) режим. Поддерживает 16-битные приложения, запускаемые как задачи в защищенном режиме. Адресное пространство - 1Мб.
  • Реальный (real) режим. Поддерживает 16-битные программы с простой регистровой адресацией сегментированной памяти. Не поддерживается виртуальная память или привилегии. Доступно 1Мб памяти.

Устаревший (legacy) режим используется только при работе 16- и 32-битных операционных систем.

1.2. Достоинства архитектуры

Подчеркнем основные достоинства архитектуры AMD x86-64:

  • 64-битное адресное пространство.
  • Расширенный набор регистров.
  • Привычный для разработчиков набор команд.
  • Возможность запуска старых 32-битных приложений в 64-битной операционной системе.
  • Возможность использования 32-битных операционных систем.

1.3. Недостатки архитектуры

Серьезных недостатков в 32-битную архитектуру новая архитектура AMD x86-64 не внесла. Отметить можно разве лишь чуть большие требования программ к памяти из-за того, что увеличился размер адресов и операндов. Однако это серьезно не скажется ни на размере кода, ни на требованиях к объему доступной оперативной памяти.

Но фактом является и то, что AMD x86-64 не привнесла ничего существенно нового. Нет принципиального повышения производительности. В среднем после перекомпиляции программы можно ожидать прирост производительности в пределах 5-15%.

2. Программная модель AMD64

Практически все современные операционные системы сейчас имеют версии для архитектуры AMD64. Так Microsoft предоставляет Windows XP 64bit, Windows Server 2003 64bit, Windows Vista 64bit. Крупнейшие разработчики UNIX систем также поставляют 64-битные версии, как например Linux Debian 3.1 x86-64. Однако это не означает, что весь код такой системы является полностью 64-битным. Часть кода ОС и многие приложения вполне могут оставаться 32-битными, т.к. AMD64 обеспечивает обратную совместимость.

64-битная версия Windows, к примеру, использует специальный режим WoW (Windows-on-Windows 64), который транслирует вызовы 32-битных приложений к ресурсам 64-битной операционной системы. Рассмотрим более подробно программную модель AMD64, доступную программисту в 64-битной системе Windows, для краткости называемой Win64.

Начнем с адресного пространства. Хотя 64-битный процессор теоретически может адресовать 16 экзабайт памяти (2^64), Win64 в настоящий момент поддерживает 16 терабайт (2^44). Этому есть несколько причин. Текущие процессоры могут обеспечивать доступ лишь к 1 терабайту (2^40) физической памяти. Архитектура (но не аппаратная часть) может расширить это пространство до 4 петабайт (2^52). Однако в любом случае, необходимо огромное количество памяти для страничных таблиц, отображающих память (см. таблицу 3).

32-битный режим

64-битный режим

Общее адресное пространство процесса

Адресное пространство, доступное 32-битному процессу

2Гб (3Гб, если система загружена с ключом /3GB)

4Гб, если приложение скомпилировано с ключом /LARGEADDRESSAWARE (2Гб иначе)

Адресное пространство, доступное 64-битному процессу

Нерезидентный пул (paged pool)

Резидентный пул (non-paged pool)

System Page Table (PTE)

Таблица 3. Основные ограничения памяти в Windows

Как и в Win32, адресуемый диапазон памяти делится на пользовательские адреса и на системные. Каждый процесс получает 8Тб и 8Тб остается системе (в отличие от 2Гб и 2Гб в Win32 соответственно). Различные версии Windows имеют различные ограничения, представленные в таблице 4.

Физическая память и количество процессоров

32-битные модели

64-битные модели

Windows XP Home

Windows XP Professional

128 Гбайт, 1-2 CPU

Windows Server 2003, Standard

32 Гбайт, 1-4 CPU

Windows Server 2003, Enterprise

64 Гбайт, 1-8 CPU

Windows Server 2003, Datacenter

Windows Server 2008, Datacenter

64 Гбайт, 2-64 CPU

2 Тбайт, 2-64 CPU

Windows Server 2008, Enterprise

64 Гбайт, 1-8 CPU

Windows Server 2008, Standard

32 Гбайт, 1-4 CPU

Windows Server 2008, Web Server

32 Гбайт, 1-4 CPU

Vista Home Basic

Vista Home Premium

16 Гбайт, 1-2 CPU

128 Гбайт, 1-2 CPU

128 Гбайт, 1-2 CPU

128 Гбайт, 1-2 CPU

Таблица 4.Ограничения различных версий Windows.

Также как и в Win32 размер страницы составляет 4Кб. Первые 64Кб адресного пространства никогда не отображаются, т.е. наименьший правильный адрес это 0x10000. В отличие от Win32, системные DLL загружаются выше 4Гб.

Все процессоры, реализующие AMD64, имеют поддержку для "CPU No Execution" бита, который Windows использует для реализации аппаратной технологии "Data Execution Protection" (DEP), которая запрещает исполнение пользовательских данных вместо кода. Это позволяет повысить надежность программ, исключая влияние ошибок типа выполнения буфера с данными как кода.

Особенность компиляторов для AMD64 в том, что они могут наиболее эффективно использовать регистры для передачи параметров в функции, вместо использования стека. Это позволило разработчикам Win64 архитектуры избавиться от такого понятия как соглашение о вызовах (calling convention). В Win32 можно использовать разные соглашения (способы передачи параметров): __stdcall, __cdecl, __fastcall и т.д. В Win64 есть только одно соглашение о вызовах. Рассмотрим пример, как передаются в регистрах четыре аргумента типа integer:

  • RCX: первый аргумент
  • RDX: второй аргумент
  • R8: третий аргумент
  • R9: четвертый аргумент

Аргументы после первых четырех integer передаются на стеке. Для float аргументов используются XMM0-XMM3 регистры, а также стек.

Разница в соглашениях о вызове приводит к тому, что в одной программе нельзя использовать и 64-битный, и 32-битный код. Другими словами, если приложение скомпилировано для 64-битного режима, то все используемые библиотеки (DLL) также должны быть 64-битными.

При написании 64-битного кода можно получить дополнительный выигрыш в производительности за счет специальной оптимизации. Подробно этот вопрос рассмотрен в руководстве по оптимизации [3].

3. Перенос приложений на AMD64

Одним из назначений языков высокого уровня является по возможности сократить привязку программного кода к архитектуре и обеспечить максимально возможную переносимость между аппаратными платформами. Например, правильно написанные программы на языке Си++ теоретически не зависят от аппаратной платформы. И для компиляции существующих 32-битный приложений под платформу AMD64 в идеале достаточно просто сменить компилятор [4] и просто перекомпилировать программу. Но на практике дела обстоят более сложно.

До сих пор существует программное обеспечение, использующий ассемблерный код для 32-битных процессоров. Многие программы, написанные на языках высокого уровня, содержат ассемблерные вставки. Поэтому просто перекомпилировать большой проект часто бывает невозможно. Решение проблемы понятно. Во-первых, можно отказаться от переноса приложения на новую платформу. Это может быть весьма разумным решением, так как, например операционные системы семейства Windows обеспечивают хорошую обратную совместимость, благодаря технологии Wow64. Второй вариант - переписать программный код. Причем разумным выглядит его переписывание с использованием языков высокого уровня. Кстати заметим, что компилятор Visual C++ более не поддерживает компиляцию ассемблерных вставок в 64-битном режиме компиляции [5].

Наличие ассемблерного программного кода не единственное препятствие при освоении 64-битных систем. При переносе программ на 64-битные системы возникают разнообразные ошибки, связанные с изменением модели данных (размерности типов). Причем ряд ошибок проявляет себя только при использовании большого объема памяти, который был не доступен на 32-битных системах. Подобные ошибки хорошо описаны в статье "20 ловушек переноса Си++ - кода на 64-битную платформу" [6].

Для тестирования и проверки программного кода, переносимого на 64-битную платформу можно использовать различные специальные методики и инструменты [7]. Например, хорошие результаты дает использование статических анализаторов, таких как Viva64 (для Windows систем) и PC-Lint (для Unix систем). Более подробно с этим инструментарием можно познакомиться в статье "Сравнение диагностических возможностей анализаторов при проверке 64-битного кода" [8].

Заключение

Предложенная компанией AMD архитектура AMD64 несомненно оказалась востребованной на рынке. Достоинство AMD64 в том, что она позволяет плавно перейти на 64-битные программы, при этом не теряя совместимости со старыми 32-битными приложениями. Однако ничего революционного в AMD64 нет.

Миграция 32-битных программ на AMD64, как показывают эксперименты, позволяет, во-первых, решать задачи, существенно более требовательные к памяти, а, во-вторых, получить порядка 10% прироста производительности "просто так", без изменения кода, за счет оптимизации компилятором приложения под новую архитектуру.

Можно сделать вывод, что архитектура AMD64 на много лет отодвинула проблему ограничения доступного объема оперативной памяти, но не решила проблем роста производительности современных персональных машин. Будущее остается за многоядерными и многопроцессорными системами.

Читайте также: