Здравствуйте, Hard_Club, Вы писали:
H_C>Как выравнивание на 4 байта может ускорить выполнение программы?
современные интеловские процессоры умеют обращаться к невыравненным данным, но при этом делают 2 обращения к памяти, из-за чего страдает производительность.
более старые выдавали исключение при обращении к невыровненным данным
Здравствуйте, x32x32, Вы писали:
X>современные интеловские процессоры умеют обращаться к невыравненным данным, но при этом делают 2 обращения к памяти, из-за чего страдает производительность. X>более старые выдавали исключение при обращении к невыровненным данным
Intel никогда не давал исключение, если не поднят флаг AC. Другие, типа MIPS, дают и сейчас, если явно не сказать, что доступ невыровненный. Так что "более старые" тут неуместно.
Здравствуйте, Hard_Club, Вы писали:
H_C>Как выравнивание на 4 байта может ускорить выполнение программы?
На классической PCI, например (очень хороший вариант для иллюстрации метода), доступ в память делался так: в адресе всегда младшие 2 бита сброшены, а 4 отдельные линии управляют доступом к байтам по смещению 0-3 от базового адреса.
Поэтому чтение 4 байт по адресу 8 производится в одну операцию: адрес 8, маска байтов 1111, а по адресу 9 — в две: в первой адрес 8, маска 0111, во второй адрес 12, маска 1000. Потом процессор должен ещё и собрать результаты этих двух операций в одно слово данных, перегруппировав их через сдвиговый комбинатор с двумя входами.
Почему так? Потому что альтернатива в виде "подать адрес 9 и признак чтения 4 байт, а дальше пусть память разбирается" хуже — сложность операции перекладывается на контроллер памяти, на саму память и т.д., которые заведомо менее сложны и у них меньше ресурсов для такой операции. Проще переложить это действие на процессор, ибо "пусть лошадь думает, у неё голова большая". Другая альтернатива — читать побайтно — отвергается по причине очевидных тормозов.
Современная система сильно сложнее из-за нескольких кэшей и т.д., но общий принцип тот же — передачи данных режутся на порции оптимального для системы размера — степени двойки и на границе адреса, кратной той же степени. Однако присутствие кэша сильно усложняет картину. Например, если строки L1 имеют размер 16 байт, и доступ в 4 байта, не кратный 4, не пересекает границу 16 байт, то затраты — дополнительное обращение в L1 за уже лежащей там строкой; а вот если пересекает границу 16 байт — то такой доступ приводит к работе уже с двумя строками кэша. То есть типичный случай не сильно дороже, а вот худший — сильно дороже; в среднем всё равно получается проседание.
Здравствуйте, netch80, Вы писали:
X>>современные интеловские процессоры умеют обращаться к невыравненным данным, но при этом делают 2 обращения к памяти, из-за чего страдает производительность. X>>более старые выдавали исключение при обращении к невыровненным данным
N>Intel никогда не давал исключение, если не поднят флаг AC.
Исключение — доступ командами SSE — некоторые из них жёстко требуют выравнивания.
Здравствуйте, Hard_Club, Вы писали: H_C>Как выравнивание на 4 байта может ускорить выполнение программы?
чтение производится блоками. допустим, есть шина 512 бит. ты читаешь 2 инта, но один из них находится на границе одного блока, другой — другого. в итоге нужно сделать 2 чтения и потом их слепить. тормозить будет страшно — вместо одного чтения делаешь два, еще и каждый раз задействуешь всего 32 бита шины из 512. если хочется быстро нужно читать сразу блоком в 512. но для этого нужно выравнивание по, грубо говоря, началу блока.
Здравствуйте, netch80, Вы писали:
N>Исключение — доступ командами SSE — некоторые из них жёстко требуют выравнивания.
А те, которые не требуют — работают с той же производительностью (в среднем) и упираются в пропускную способность кэша второго уровня.
Выравнивание там, скорее, защита от дурака. Невыравненные данные — косвенный признак битого указателя.
Ну и выравненные гарантированно попадают в одну линейку кэша, а невыравненные могут зацепить сразу две соседних линейки и, при одиночном обращении, быть вдвое тормознутее.
Здравствуйте, dilmah, Вы писали:
N>> "пусть лошадь думает, у неё голова большая".
D>офф: а есть какой-нибудь хороший/общепринятый вариант этого по-английски?
Здравствуйте, Кодт, Вы писали:
К>Выравнивание там, скорее, защита от дурака. Невыравненные данные — косвенный признак битого указателя.
Оффтоп не в порядке придирки: "невыравненные" это описка или новая норма русского языка российского разлива? gramota.ru дала два разных ответа, а после слова "разыскной" я уже не знаю, чему верить.
Здравствуйте, netch80, Вы писали:
N>Здравствуйте, Кодт, Вы писали:
К>>Выравнивание там, скорее, защита от дурака. Невыравненные данные — косвенный признак битого указателя.
N>Оффтоп не в порядке придирки: "невыравненные" это описка или новая норма русского языка российского разлива? gramota.ru дала два разных ответа, а после слова "разыскной" я уже не знаю, чему верить.
Уверен, что описка. "Разыскной" — там приставка рас/рос (при корне "сыск"), а в выровненный это не приставка, а корень "ровный", так что правило рас/рос тут неприменимо.