Выравнивание данных

Тема в разделе "WASM.BEGINNERS", создана пользователем XshStasX, 5 июл 2010.

  1. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    В чем смысл выравнивания данных для процессора ?
    То есть почему он не может(или не хочет читать данные которые не выровняные).
    А то интересно зачем выравнивать для некоторых WINAPI данные.
     
  2. google

    google New Member

    Публикаций:
    0
    Регистрация:
    10 авг 2007
    Сообщения:
    140
  3. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    o Производительность. Чем короче адрес, тем выше скорость обращения.
    o Защита. Не выравненные данные могут рассматриваться как рандомные, для этого введена защита как хардварная(#AC), так и програмная(#STATUS_DATATYPE_MISALIGNMENT для NT).
     
  4. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    То есть типа проще набрать его на шине ?
    Если я правильно понял то:
    Есть комп 32х разрядный, когда читаем один байт то комп читает 4 байта в любом случаи?
    Код (Text):
    1. mov al,byte ptr [eax] ; комп. прочитает из памяти 1 или 4 байта ?..
     
  5. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    XshStasX
    комп не умеет читать :derisive:
    А вообще как я понимаю зависит от разрядности шины
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    XshStasX
    Каждый элемент шины отвечающий за адресацию одного бита вносит задержки при переключениях. Вот чем короче адрес, тем меньше элементов вовлекается в адресацию и тем выше производительность.
     
  7. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Clerk
    ясно) А как по поводу этого:
    Я прав или нет?
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    XshStasX
    Зависит от типа памяти и протоколов. Например может адресаваться регистр(в рам) за один синхротакт, либо на шине формироваться адрес частями. В придачу зависит от размера регистра и память нынче динамическая. Этих нюансов я не знаю. Смотрите в даташитах.
     
  9. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    хм ясно)...
     
  10. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Не пойму о каких-таких процессорах вы тут толкуете ;)

    Современные x86 работают с обычной WB-памятью через кэш и соотв-но читают\пишут данные из\в ОЗУ линейками\секторами по 64 или 128 байт (а не бит !) по выравненным адресам. Обмен данными между кэшем и регистрами (точнее буферами чтения\записи) ес-но идет в соотв-ии с размером операнда, т.е. при mov al,mem пересылается только 1 байт, а не 4 и не 8.
    И требования к выравниванию в современных компах стали менее критичными, чем в древних 486\586 - в интеловских камнях существенная задержка возникает только при чтении операнда, пересекающего 64-байтную границу (т.е. чтение из двух линеек кэша), у АМД - тоже, плюс доп.задержка в 1 такт при пересечении 8-байтной границы. Однако несмотря на эти "поблажки", тем не менеее рекумендуется придерживаться устоявшихся правил выравнивания адресов на размер операнда (при этом и пересечения границ кэш-линеек не будет)

    PS: Помимо скорости, выравнивание влияет и на атомарность чтения\записи при многопоточном доступе, т.к. при пересечении кэш-линейки данные читаются\пишутся не атомарно - в два приема вместо одного
     
  11. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Эту тему создавал что понять почему NtQueryInformationFile не работает если ей передать не выровняные данные.
    Думал что это какая то особенно железа...
     
  12. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    XshStasX
    ProbeForRead() проверяет выравнивание и генерит сепшен.
     
  13. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    Эта "защита" у меня всегда вызывала недоумение. Любой код может сбросить/установить
    EFLAGS.AC.
     
  14. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    А как насчет некэшируемой памяти? Есть мнение что все то же самое. Тут попался интеловский талмуд по первому пеньку от 95 года. Там четко указано, что в момент включения проц читает память по адресу FFFFFFC0 хотя по сути ему нужна инструкция по
    FFFFFFF0.Понятно, что в данном случае кэш отключен.
     
  15. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    medstrax1
    Не то же самое, просто размер шины данных уже давным давно сотавляет 64 бита = 8 байт и соотв-но минимальный чанк обмена с ОЗУ = 8 байтам. Если нужно записать меньше 8-ми, то это (видимо) указывается в управляющем слове\заголовке пакета
     
  16. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    Приведу цитату целиком
    When the CPU is released from reset, it will load the first instruction from the
    reset vector, 0xFFFF_FFF0 physical address.
    This address will be mapped to a Firmware Hub (FWH) on the Low Pin Count
    (LPC) Interface or a Serial Peripheral Interface (SPI) flash or on a PCI bus
    depending on the system straps option that is sampled at power up.
    If you have tried to probe the LPC bus or SPI interface to look for the first
    fetch of BIOS code from the firmware location, you will find that instead of
    address 0xFFFF_FFF0h, you will find 0xFFFF_FFC0h. This is due to the
    processor initiating a code fetch to read an entire cache line (64B) size. This
    is not a problem as the processor prefetches in cache line granularity.
    Понятно, что сразу после RESET# кэширование выключено, однако проц тем не менее выбирает код порциями равными размеру линейки кэша. Хотя физически за один цикл шины
    все равно читается только 8 байт.
     
  17. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Вообще-то тут речь идет о загрузке кода, а не данных. Фетч кода в процессор всегда осущ-ся выравненными блоками по 16\32\64 байта
     
  18. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    Ясно, т.е. когда речь идет о данных, то на размер фактически считываемого блока памяти влияет кэширование. Когда речь идет о коде, эта зависимость отсутствует.
     
  19. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Ес-но, т.к. размер считываемых данных известен заранее из формата команды, а при загрузке кода ничего заранее не известно - и размер команд может варьироваться от 1 до аж 15 байт с учетом префиксов, и декодер расчитан на обработку не одной, а до 3-4 команд за такт - соотв-но чем шире "входное окно", тем лучше