Зачем нужно выравнивание?
От: Hard_Club  
Дата: 04.11.13 17:43
Оценка:
Как выравнивание на 4 байта может ускорить выполнение программы?

04.11.13 23:35: Перенесено модератором из 'C/C++. Прикладные вопросы' — Кодт
Re: Зачем нужно выравнивание?
От: x32x32  
Дата: 04.11.13 17:47
Оценка: -1
Здравствуйте, Hard_Club, Вы писали:

H_C>Как выравнивание на 4 байта может ускорить выполнение программы?


современные интеловские процессоры умеют обращаться к невыравненным данным, но при этом делают 2 обращения к памяти, из-за чего страдает производительность.
более старые выдавали исключение при обращении к невыровненным данным
Re[2]: Зачем нужно выравнивание?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 04.11.13 18:18
Оценка: +1
Здравствуйте, x32x32, Вы писали:

X>современные интеловские процессоры умеют обращаться к невыравненным данным, но при этом делают 2 обращения к памяти, из-за чего страдает производительность.

X>более старые выдавали исключение при обращении к невыровненным данным

Intel никогда не давал исключение, если не поднят флаг AC. Другие, типа MIPS, дают и сейчас, если явно не сказать, что доступ невыровненный. Так что "более старые" тут неуместно.
The God is real, unless declared integer.
Re: Зачем нужно выравнивание?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 04.11.13 18:30
Оценка: 10 (1) +1
Здравствуйте, 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 байт — то такой доступ приводит к работе уже с двумя строками кэша. То есть типичный случай не сильно дороже, а вот худший — сильно дороже; в среднем всё равно получается проседание.
The God is real, unless declared integer.
Re[3]: Зачем нужно выравнивание?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 04.11.13 18:31
Оценка:
Здравствуйте, netch80, Вы писали:

X>>современные интеловские процессоры умеют обращаться к невыравненным данным, но при этом делают 2 обращения к памяти, из-за чего страдает производительность.

X>>более старые выдавали исключение при обращении к невыровненным данным

N>Intel никогда не давал исключение, если не поднят флаг AC.


Исключение — доступ командами SSE — некоторые из них жёстко требуют выравнивания.
The God is real, unless declared integer.
Re[2]: Зачем нужно выравнивание?
От: dilmah США  
Дата: 04.11.13 18:38
Оценка:
N> "пусть лошадь думает, у неё голова большая".

офф: а есть какой-нибудь хороший/общепринятый вариант этого по-английски?
Re: Зачем нужно выравнивание?
От: __kot2  
Дата: 04.11.13 19:13
Оценка:
Здравствуйте, Hard_Club, Вы писали:
H_C>Как выравнивание на 4 байта может ускорить выполнение программы?
чтение производится блоками. допустим, есть шина 512 бит. ты читаешь 2 инта, но один из них находится на границе одного блока, другой — другого. в итоге нужно сделать 2 чтения и потом их слепить. тормозить будет страшно — вместо одного чтения делаешь два, еще и каждый раз задействуешь всего 32 бита шины из 512. если хочется быстро нужно читать сразу блоком в 512. но для этого нужно выравнивание по, грубо говоря, началу блока.
Re[4]: Зачем нужно выравнивание?
От: Кодт Россия  
Дата: 04.11.13 19:34
Оценка:
Здравствуйте, netch80, Вы писали:

N>Исключение — доступ командами SSE — некоторые из них жёстко требуют выравнивания.

А те, которые не требуют — работают с той же производительностью (в среднем) и упираются в пропускную способность кэша второго уровня.

Выравнивание там, скорее, защита от дурака. Невыравненные данные — косвенный признак битого указателя.

Ну и выравненные гарантированно попадают в одну линейку кэша, а невыравненные могут зацепить сразу две соседних линейки и, при одиночном обращении, быть вдвое тормознутее.
Перекуём баги на фичи!
Re[3]: Зачем нужно выравнивание?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 04.11.13 19:50
Оценка: 3 (1)
Здравствуйте, dilmah, Вы писали:

N>> "пусть лошадь думает, у неё голова большая".


D>офф: а есть какой-нибудь хороший/общепринятый вариант этого по-английски?


Может тут — http://forum.wordreference.com/showthread.php?t=2010936&langid=18

А так, еще, поищи "Приключения Васи Куролесова" с английской озвучкой
Маньяк Робокряк колесит по городу
Re[5]: Зачем нужно выравнивание?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 04.11.13 20:03
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Выравнивание там, скорее, защита от дурака. Невыравненные данные — косвенный признак битого указателя.


Оффтоп не в порядке придирки: "невыравненные" это описка или новая норма русского языка российского разлива? gramota.ru дала два разных ответа, а после слова "разыскной" я уже не знаю, чему верить.
The God is real, unless declared integer.
Re[6]: Зачем нужно выравнивание?
От: jazzer Россия Skype: enerjazzer
Дата: 05.11.13 02:12
Оценка:
Здравствуйте, netch80, Вы писали:

N>Здравствуйте, Кодт, Вы писали:


К>>Выравнивание там, скорее, защита от дурака. Невыравненные данные — косвенный признак битого указателя.


N>Оффтоп не в порядке придирки: "невыравненные" это описка или новая норма русского языка российского разлива? gramota.ru дала два разных ответа, а после слова "разыскной" я уже не знаю, чему верить.


Уверен, что описка. "Разыскной" — там приставка рас/рос (при корне "сыск"), а в выровненный это не приставка, а корень "ровный", так что правило рас/рос тут неприменимо.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.