32-битные указатели с ISA x86-64: почему бы и нет? - PullRequest
10 голосов
/ 10 февраля 2012

Набор команд x86-64 добавляет больше регистров и другие улучшения, помогающие оптимизировать исполняемый код.Однако во многих приложениях увеличенный размер указателя является бременем.Дополнительные, неиспользуемые байты в каждом указателе засоряют кэш и могут даже переполнить ОЗУ.GCC, например, строится с флагом -m32, и я предполагаю, что это является причиной.

Можно загрузить 32-битное значение и рассматривать его как указатель.Это не требует дополнительных инструкций, просто загрузите / вычислите 32 бита и загрузите с полученного адреса.Однако хитрость не будет переносимой, поскольку платформы имеют разные карты памяти.В Mac OS X зарезервировано все низкое 4 ГБ адресного пространства.Тем не менее, для одной программы, которую я написал, хакерское добавление 0x100000000L к 32-битным «адресам» перед использованием значительно улучшило производительность по сравнению с истинными 64-битными адресами или компиляцию с -m32.

Есть ли фундаментальное препятствие?иметь 32-битную платформу x86-64?Я полагаю, что поддержка такой химеры усложнит любую операционную систему, и любой, кто хочет получить последние 20%, должен просто заставить ее работать ™, но все же кажется, что это лучше всего подойдет для множества вычислительно насыщенных программ.

Ответы [ 3 ]

10 голосов
/ 11 февраля 2012

В разработке находится ABI под названием "x32" для linux. Это сочетание между x86_64 и ia32, похожее на то, что вы описываете - 32-битное адресное пространство при использовании полного набора 64-битных регистров. Для этого нужно собственное ядро, binutils и gcc.

Некоторые прогоны SPEC показывают улучшение производительности примерно на 30% в некоторых тестах. См. Дополнительную информацию на https://sites.google.com/site/x32abi/

0 голосов
/ 11 февраля 2012

Не ожидаю, что очень сложно поддерживать такую ​​модель в ОС.Единственное, что нужно изменить для процессов в этой модели - это управление страницами, страницы должны быть размещены ниже точки 4 ГБ.Ядро также должно выделять свои буферы из первых 4 ГБ виртуального адресного пространства, если оно передает их приложению.То же самое относится и к загрузчику, который загружает и запускает приложения.Кроме того, 64-битное ядро ​​должно обрабатывать такие приложения без серьезных изменений.

Поддержка компилятора также не должна быть большой проблемой.В основном это вопрос генерации кода, который может использовать дополнительные регистры ЦП и их полные 64-битные биты, и при необходимости добавлять правильные префиксы REX.

0 голосов
/ 10 февраля 2012

Это называется «эмуляция x86-32», или WOW64 в Windows (предположительно что-то другое в других ОС), и это аппаратный флаг в процессоре. Здесь не нужно никаких трюков в пользовательском режиме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...