Кому и зачем нужны 64-битные вычисления?

Если с внедрением 32-битности пер­со­наль­ные плат­формы яв­но за­дер­жа­лись, то по­яв­ле­ние 64-бит­ных рас­ши­ре­ний для ар­хи­тек­ту­ры x86 при­шлось и к мес­ту, и ко вре­ме­ни. Во­про­сом ко­му и за­чем они нуж­ны, ком­пью­тер­ная ин­дус­т­рия за­да­ва­лась еще 15 лет на­зад. Се­год­ня, ког­да «все уже слу­чи­лось», на­ста­ло вре­мя вер­нуть­ся к ос­но­вам и уде­лить вни­ма­ние не­ко­то­рым не­о­че­вид­ным низ­ко­у­ров­не­вым под­роб­но­с­тям.

64-битные данные

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

Регистры общего назначения процессора x86-64 (фрагмент документации AMD)

 

Формально, это не привело к увеличению максимальной ширины операндов, ведь обработка 64-битных це­ло­чис­лен­ных данных уже была реализована в Pentium MMX. Процессор Pentium III поддерживал еще и 128-битное рас­ши­ре­ние SSE.

Числа с плавающей точкой в 64-битном двойном формате (а равно и в 80-битном внутреннем вещественном фор­ма­те) поддерживались ровесником IBM PC – математическим сопроцессором Intel 8087.

64-битный адрес

Именно ограничения 32-битного адресного пространства, объем которого составляет 232 = 4 Гигабайта стали ос­нов­ным мо­ти­ви­ру­ю­щим фактором для перехода на 64-битную архитектуру. Заметим, что в некоторых системах про­грам­ми­ро­ва­ния, лимит составлял 2 GB, так как старший бит указателя интерпретировался как знак числа. Воз­мож­ность ис­поль­зо­вать тех­но­ло­гию PAE для расширения физического адреса несколько украсила жизнь 32-битных систем. Оче­вид­ный недостаток состоял в том, что вместо плоского 64-битного адресного пространства применялся кар­ти­ру­е­мый до­ступ к час­ти ОЗУ, «не поместившейся» в 4GB-диапазон.

Акцент на адресацию памяти нашел отражение в названии 64-битной x86 архитектуры для CPU Intel — EM64T или Extended Memory 64 Technology. Напомним, процессорный гигант в то время строил планы по внедрению архитектуры IA-64 и процессоров Itanium, а название EM64T, возможно, было призвано подчеркнуть, что в отличие от IA-64, роль этой технологии сводится исключительно к увеличению объема адресуемой памяти. Как известно, жизнь рас­по­ря­ди­лась по-другому, «революционный» Itanium уступил «временному» решению авторства AMD, которое, как это часто бы­ва­ет, на­дол­го ста­ло постоянным.

64-битные инструкции

Фактором, обеспечившим сравнительную легкость перехода на архитектуру AMD64 (синоним Intel EM64T), ста­ло со­хра­не­ние основ программной модели и принципов кодирования инструкций, применявшихся в 16-ти и 32-битных про­цес­со­рах x86. При этом для представления новых команд и форматов данных используется специальный префикс REX (Re­gi­st­er Extension), наличие которого перед машинной командой изменяет ее интерпретацию.

Регистры процессора x86-64: серым цветом выделены ресурсы, доступные только в 64-битном режиме (фрагмент документации AMD)

 

Перед разработчиками стояла своеобразная оптимизационная задача. Объем машинного кода можно ми­ни­ми­зи­ро­вать, если наиболее часто встречающимся форматам команд и раз­ряд­но­с­тям операндов будет со­от­вет­ст­во­вать беc­пре­фик­с­ное кодирование. В результате, при выполнении 64-битных сегментов кода, режимом по умолчанию был при­нят режим 32-битных данных и 64-битных адресов. Для задания 64-бит­ных дан­ных, например, ис­поль­зо­ва­ния 64-бит­но­го регистра RAX вместо 32-битного EAX, потребуется префикс REX.

Дополнительным преимуществом 64-битной архитектуры является увеличение количества регистров об­ще­го наз­на­че­ния и SSE/AVX-регистров до 16. Конечно, этот факт не имеет фундаментальной связи с разрядностью про­цес­со­ра, а об­ус­лов­лен особенностями кодирования инструкций.

Применение префикса REX для увеличения количества адресуемых регистров (фрагмент документации

 

Часть битов префикса REX используются для расширения полей, адресующих регистры. Таким образом, но­мер ре­гист­ра становится 4-разрядным, а значит можно адресовать 16 элементов. Так в множество регистров об­ще­го наз­на­че­ния бы­ли до­бав­ле­ны 8 регистров R8-R15, а блок SSE получил расширение в виде регистров XMM8-XMM15.

64-битная периферия и Memory Mapped IO

Модернизация контроллеров периферийных устройств, работающих в составе 64-битных платформ, происходила с некоторым запаздыванием, относительно CPU, тем не менее, функциональность, рассмотренную ниже на сегодня можно считать свершившимся фактом для ключевых индустриальных спецификаций, таких как интерфейс NVMe и контроллер USB xHCI.

Определение 32 и 64-битных адресуемых диапазонов согласно PCI PnP: формат регистра PCI BAR (Base Address Register)

 

Для обеспечения программного доступа центрального процессора к ресурсам периферийных устройств, рас­по­ло­жен­ных в адресном пространстве памяти (memory mapped IO), согласно принципам PCI PnP, базовый адрес за­да­ет­ся в ре­гист­ре BAR (Base Address Register). 32-битный BAR позволяет расположить ресурсы устройства только в пре­де­лах ни­ж­них 4 Гигабайт. 64-битный BAR снимает это ограничение, при условии, что транзитные компоненты, такие как мос­ты и раз­вет­ви­те­ли шины PCI Express, также поддерживают 64-битную адресацию. Для систем с большим сум­мар­ным объ­е­мом memory-mapped IO (например, майнинговых ферм), это может повлиять на максимальное ко­ли­чес­т­во под­кл­юча­е­мых GPU.

64-битная периферия и режим Bus Master

Для контроллеров, самостоятельно взаимодействующих с оперативной памятью платформы, поддержка 64-битной адресации позволяет располагать буфер данных в произвольном диапазоне DRAM.

Описание бита, индицирующего способность контроллера USB3 xHCI адресовать данные и управляющие скрипты в оперативной памяти выше 4 GB (фрагмент спецификации xHCI)

 

В противном случае, если Bus Master устройство (например, контроллер mass storage или локальной сети), под­дер­жи­ва­ет только 32-битную адресацию, ОС должна выделить транзитный буфер для такого устройства ниже границы 4GB, а пря­мая доставка данных в адресное пространство приложения, в общем случае будет невозможна.

Фактор ПО

Необходимым условием утилизации рассмотренных преимуществ и как следствие роста функциональности и про­из­во­ди­тель­нос­ти, является оптимизация ПО, причем как прикладного, так и системного. Именно этот сегмент мо­жет пре­тен­до­вать на статус самого инерционного…