Оптимизация для процессоров семейства Pentium: 6. Выравнивание

Дата публикации 22 авг 2002

Оптимизация для процессоров семейства Pentium: 6. Выравнивание — Архив WASM.RU

Все данные в RAM должны быть выравненены так, чтобы их адреса были кратны 2, 4, 8 или 16 согласно данной схеме:

Код (Text):
  1.  
  2.                              выравнивание
  3.   размер операнда PPlain и PMMX   PPro, PII и PIII
  4.   1  (byte)            1                  1
  5.   2  (word)            2                  2
  6.   4  (dword)           4                  4
  7.   6  (fword)           4                  8
  8.   8  (qword)           8                  8
  9.   10 (tbyte)           8                  16
  10.   16 (oword)          n.a.                16

На PPlain и PMMX при обращении к невыравненным данным будет теряться по меньшей мере 3 такта, если пересечена граница в 4 байта. Потери будут выше при пересечении границы кэша.

На PPro, PII и PIII невыравненные данные удут стоить вам 6-12 дополнительных тактов, если пересечена граница кэша. Невыравненные операнды, меньшие чем 16 байтов и не перешедшие границу в 32 байта, не приводят к потерям.

Выравнивание данных на 8 или 16 в стеке двойных слов может стать проблемой. Общий метод решения - установить выравненный указатель на кадр стека. Функция с выравненными локальными данными может выглядеть примерно так:

Код (Text):
  1.  
  2. _FuncWithAlign PROC NEAR
  3.         PUSH    EBP                        ; пролог
  4.         MOV     EBP, ESP
  5.         AND     EBP, -8                    ; выравнивание указателя на кадр
  6.                                              стека на 8
  7.         FLD     DWORD PTR [ESP+8]          ; параметр функции
  8.         SUB     ESP, LocalSpace + 4        ; резервируем локальные данные
  9.         FSTP    QWORD PTR [EBP-LocalSpace] ; теперь сохраняем что-нибудь в
  10.                                            ; локальной переменной
  11.         ...
  12.         ADD     ESP, LocalSpace + 4        ; эпилог, восстанавливаем ESP
  13.  
  14.         POP     EBP                        ; (потеря скорости AGI на PPlain/PMMX)
  15.         RET
  16. _FuncWithAlign ENDP

В то время как выравнивание данных важно всегда, выравнивание кода не является необходимым на PPlain и PMMX. Принципы выравнивания кода на PPro, PII и PIII изложены в главе 15. © Агнер Фог, пер. Aquila


0 794
archive

archive
New Member

Регистрация:
27 фев 2017
Публикаций:
532