UEFI-диагностика: первые итоги

07 Ноя 2013

UEFI-диагностика: первые итоги

В недавно опубликованной статье «UEFI-диагностика: проблемы и решения» мы акцентировали внимание на одной особенности firmware современных персональных платформ, приводящей к существенному снижению производительности при доступе центрального процессора к видео памяти. Недостаток контекста, созданного BIOS при ини­ци­а­ли­за­ции ресурсов шины PCI Express, состоит в том, что Prefetchable диапазон видео адаптера, обеспечивающий доступ к видео памяти, адресуется через Non-Prefetchable диапазон моста PCI Express. При этом Prefetchable диапазон моста PCI Express выключен. Это делает невозможным использование тех­нологий повышения пропускной способности шины при операциях с видео памятью.

Плоды оптимизации

Мы решили начать с проверки радикального решения задачи оптимизации доступа к видео памяти. Инженерный образец UEFImark v0.97 Extreme Edition, создает новый диапазон доступа к видео памяти и размещает его выше 4GB. В нашем примере это диапазон от 16GB-256MB до 16GB.

При установке видео адаптера в слот PCI Express x16 результаты работы утилиты UEFImark следующие:


Рис. 1. Результат без оптимизации:
Video memory write (MB/S): 297.6 (SSE), 73.8 (386)
Для доступа к видео памяти используется диапазон адресов, находящийся ниже 4GB (E0000000h-EFFFFFFFh).
Диапазон имеет статус Prefetchable с точки зрения PCI PnP и Write Combining с точки зрения CPU MTRR.

 


Рис. 2. Результат с оптимизацией:
Video memory write (MB/S): 2788.5 (SSE), 2623.6 (386)
Для доступа к видео памяти используется диапазон адресов, находящийся выше 4GB (3F0000000h-3FFFFFFFFh).
Диапазон имеет статус Prefetchable с точки зрения PCI PnP и Write Combining с точки зрения CPU MTRR.

Выполним аналогичное сравнение при установке видео адаптера в слот PCI Express x4:


Рис. 3. Результат без оптимизации:
Video memory write (MB/S): 297.5 (SSE), 73.8 (386).

 


Рис. 4. Результат с оптимизацией:
Video memory write (MB/S): 702.6 (SSE), 673.3 (386).

Как видим, при использовании оптимизации происходит не только многократное увеличение скорости записи в видео память, но и становится заметной различная скорость работы шины в режимах PCIe x4 и PCIe x16. Без оп­ти­ми­за­ции, x4 и x16 дают одинаковый результат.

Примечательно, что исследуемый недостаток firmware и эффект его устранения имеют место как при ис­поль­зо­ва­нии PCI Express x16 порта в процессоре (рис. 1 и 2) так и PCI Express x4 порта, обслуживаемого системной логикой (рис. 3 и 4).

Первые результаты внушают оптимизм. Вместе с тем, данное решение экспериментальное и реализовано для частного случая. Измененный базовый адрес видео памяти не совместим с контекстом UEFI firmware. Поэтому, во время действия измененного контекста нельзя использовать UEFI сервисы, работающие с видео памятью, например GOP.BLT. Программа может выполнять запись в видео память только самостоятельно, с использованием измененного базового адреса.

Проблемы совместимости

Следующим шагом пробуем реализовать менее радикальный вариант, совместимый с контекстом UEFI firmware. Перепрограммируем регистры Memory Base/Limit и Prefetchable Memory Base/Limit моста PCI Express, определяющие статус адресуемых диапазонов. Базовый адрес и размер диапазона доступа к видео памяти не изменяем, просто переведем его из статуса Non-Prefetchable в статус Prefetchable.

В отличие от первого опыта, в котором мы размещали видео память выше 4GB, ожидаемой прибавки производительности не зафиксировано. И это несмотря на то, что диапазон доступа к видео памяти имеет атрибут Prefetchable (с точки зрения PCI PnP) и статус Write Combining (с точки зрения CPU MTRR).

Гипотезы и подтверждения

Наши результаты позволяют предположить, что в силу некоторого недокументированного свойства процессора, в диапазоне адресов ниже 4GB статус Write Combining (определяемый содержимым MTRR регистров процессора) и (или) статус Prefetchable (определяемый содержимым конфигурационных регистров PCI) не действует. Если это так, то размещение диапазона выше 4GB, является обязательным для применения рассмотренного метода повышения производительности записи в видео память.

Указанное свойство, не описанное в документации Intel, неожиданно всплывает в документе UEFI Platform Initialization Specification. Volume 5. Standards:

Таблица из документа UEFI Platform Initialization Specification. Volume 5. Standards.  Описание двух флагов, индицирующих поддержку атрибутов для диапазонов памяти и 64-битной адресации
Рис 5. Таблица из документа UEFI Platform Initialization Specification. Volume 5. Standards.
Описание двух флагов, индицирующих поддержку атрибутов для диапазонов памяти и 64-битной адресации

На этапе разработки платформы, для трансляции проекта UEFI firmware и получения двоичного образа BIOS, программист должен задать два флага, которые определяют адаптацию firmware под архитектурные особенности платформы.

Первый флаг называется EFI_PCI_HOST_BRIDGE_COMBINE_MEM_PMEM, его установка в “1” означает, что PCI подсистема не поддерживает разделение пространства памяти на Prefetchable и Non-Prefetchable диапазоны и все диапазоны должны быть декларированы как Non-Prefetchable.

Второй флаг называется EFI_PCI_HOST_BRIDGE_MEM64_DECODE, его установка в “1” означает, что PCI подсистема поддерживает 64-битную адресацию Memory Mapped I/O и, следовательно, есть возможность размещения диапазонов MMIO выше 4GB.

Приведенная информация отличается от наших экспериментальных данных только тем, что в первоисточнике не написано, что для диапазонов, находящихся выше 4GB, возможность создания которых декларирует второй флаг, не действует ограничение, которое декларирует первый флаг. Поэтому, при адресации видео памяти выше 4GB, статус prefetchable работает.

Резюме

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