OSDev

для всех
Текущее время: 29 мар 2024, 12:51

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 23 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Re: Выравнивание и кэш
СообщениеДобавлено: 09 апр 2015, 23:34 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Цитата:
линейка кэш ,например 32 байта, структура ,например 28 байт

Кэш линейка давно уже 128 байт.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Выравнивание и кэш
СообщениеДобавлено: 10 апр 2015, 00:15 
Аватара пользователя

Зарегистрирован: 28 май 2012, 23:44
Сообщения: 237
Откуда: Санкт-Петербург
Ну вот, на 128 байт никто же пока не догадался выравнивать? Предположим, я сделаю в компиляторе опцию выравнивания на 128 байт. Ну, типа, хрен с ней, с памятью, она нынче дешевая... Какие профиты и/или головняки это даст? Или пшик один, только расход памяти?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Выравнивание и кэш
СообщениеДобавлено: 10 апр 2015, 01:01 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Сишные компиляторы выравнивают как и положено, согласно размеру типов.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Выравнивание и кэш
СообщениеДобавлено: 10 апр 2015, 02:29 
Аватара пользователя

Зарегистрирован: 28 май 2012, 23:44
Сообщения: 237
Откуда: Санкт-Петербург
Himik писал(а):
Сишные компиляторы выравнивают как и положено, согласно размеру типов.

А как положено-то? Определенное значение выравнивания всё равно или задается, или берется из умолчаний. Вот, посмотрел про pack в Visual Studio:
MSDN писал(а):
pack gives control at the data-declaration level. This differs from compiler option /Zp, which only provides module-level control. pack takes effect at the first struct, union, or class declaration after the pragma is seen. pack has no effect on definitions. Calling pack with no arguments sets n to the value set in the compiler option /Zp. If the compiler option is not set, the default value is 8.

Не отличается от Delphi, стало быть. В чем магия числа 8? Почему не 4? 32-битная платформа ведь. Там дальше еще про SetErrorMode(SEM_NOALIGNMENTFAULTEXCEPT) говорится, но она вроде только для Itanium.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Выравнивание и кэш
СообщениеДобавлено: 10 апр 2015, 09:02 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Вот что пишет Intel по поводу 8-мёрки. Думаю что выравнивание в структурах данных нужно только для store to load forwarding. Но насколько это эффективно не нашел нигде.

Цитата:
2.2.4.4 Store Forwarding
If a load follows a store and reloads the data that the store writes to memory, the
Intel Core microarchitecture can forward the data directly from the store to the load.
This process, called store to load forwarding, saves cycles by enabling the load to
obtain the data directly from the store operation instead of through memory.
The following rules must be met for store to load forwarding to occur:
• The store must be the last store to that address prior to the load.
• The store must be equal or greater in size than the size of data being loaded.
• The load cannot cross a cache line boundary.
• The load cannot cross an 8-Byte boundary. 16-Byte loads are an exception to this
rule.
• The load must be aligned to the start of the store address, except for the
following exceptions:
— An aligned 64-bit store may forward either of its 32-bit halves
— An aligned 128-bit store may forward any of its 32-bit quarters
— An aligned 128-bit store may forward either of its 64-bit halves
Software can use the exceptions to the last rule to move complex structures without
losing the ability to forward the subfields.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Выравнивание и кэш
СообщениеДобавлено: 10 апр 2015, 12:11 
Аватара пользователя

Зарегистрирован: 16 апр 2010, 10:10
Сообщения: 320
Откуда: Псковская обл.
Восьмёрка - компромисная величина? А хардкор тогда будет 128?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Выравнивание и кэш
СообщениеДобавлено: 10 апр 2015, 12:15 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Freeman писал(а):
А как положено-то?

Согласно размеру типов. Это значит адрес выравнивания должен быть кратен размеру переменной. Для char=1, считай без выравнивания, для int=4 и т.д. Размещение структур и массивов выравниваются на значение параметра pack. Тоесть char не будет выравненным на 8, а char[2] будет. И struc{char a; char b;} c; будет на 8. Значение параметра pack не означает выравнивание каждой переменной, а определяет максимально разрешённое выравнивание. Если задать pack 4, то char и short по прежнему будут выравниваться на 1 и 2, но зато __int64 будет выравнен не на 8, а на 4, и структуры тоже.
Магия числа pack=8 в том, что это размер самого большого типа в процессоре.


Последний раз редактировалось Himik 10 апр 2015, 15:02, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Выравнивание и кэш
СообщениеДобавлено: 10 апр 2015, 14:04 

Зарегистрирован: 04 ноя 2007, 14:48
Сообщения: 113
Цитата:
Ну вот, в кои веки решил что-то спросить, а ответа не получил.


А, к этому надо привыкать. Крайне забавно выглядит когда ты спрашиваешь что то человека а он зависает. Особенно забавно наблюдать это ИРЛ. Какое то психическое отклонение. Причём если начинаешь переспрашивать, обижаются, думают что ты их за идиотов держишь.

По теме уже многое сказали. Выскажу своё имхо ещё раз. Во первых, выравнивание в делфи есть, так что опцию на сколько байт выравнивать сделать не составляет труда, вопрос в самой константе.
Если платформа 32-битная, то логично выбрать 4 байта, что и сделано в старых компиляторах. Однако развитие идёт к 64-битной платформе. Даже на 32-битных процессорах, если меня не ввели в заблуждение, обмен с ОЗУ 64-битный. Начиная с этого момента, выравнивание на 64-бит уже даёт свои преимущества. Нельзя также исключать legacy 32-битный режим на 64-битных процессорах. Далее, возможно борландовцам проще было оставить одну константу на все режимы компляции, неизвестно же как там компилятор устроен (а может на рантайм завязка, на менеджер памяти). Забавная история с выравниванием полей в записях, когда они перечислены через запятую и через точку с запятой. Delphi7 обрабатывал объявления через запятую как packed-кортеж, сейчас всё обрабатывается однотипно. Т.е. не всё там у них прозрачно видимо. В документации написано что выравнивание на 8 байт быстрее, чем на 4, без более подробных сведений. Чтож, я им верю.

Вообще раз уж есть такая тема, то заинтересованным лицам предлагаю сделать замеры, на сколько % выравнивание на 8 байт быстрее чем на 4 байта, и на каких системах соответственно. Это был бы нормальный, объективный критерий, а не растекание мыслью по дереву. Мы тут флудим уже дольше чем такой тест написать и прогнать. Замерять, наверное, надо только 8-байтовые поля, т.е. int64 или float64, т.к. меньшие на 8 байт и не должны выравниваться.

Цитата:
Из какого еще проекта?

Ну очевидно же: из другого. Какой проект подразумевал автор поста - хз. Но это может быть, например, fpc, или interbase, или gcc.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Выравнивание и кэш
СообщениеДобавлено: 10 апр 2015, 14:24 

Зарегистрирован: 04 ноя 2007, 14:48
Сообщения: 113
Цитата:
В чем магия числа 8? Почему не 4? 32-битная платформа ведь


Магия числа 8 в 64-разрядной шине. 32-битная не платформа а код.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Выравнивание и кэш
СообщениеДобавлено: 10 апр 2015, 16:54 
Аватара пользователя

Зарегистрирован: 28 май 2012, 23:44
Сообщения: 237
Откуда: Санкт-Петербург
pavia писал(а):
Думаю что выравнивание в структурах данных нужно только для store to load forwarding.

А в каких процессорах оно появилось? В интернетах видел ссылки на Intel Core. А ведь Delphi 6 выпущен 12 лет назад, когда был только Pentium 4.

Himik писал(а):
Согласно размеру типов. Это значит адрес выравнивания должен быть кратен размеру переменной. Для char=1, считай без выравнивания, для int=4 и т.д. Размещение структур и массивов выравниваются на значение параметра pack. Тоесть char не будет выравненным на 8, а char[2] будет. И struc{char a; char b;} c; будет на 8. Значение параметра pack не означает выравнивание каждой переменной, а определяет максимально разрешённое выравнивание.

Спасибо за разъяснение. Я как-то так и представлял, но в таком изложении стало еще понятней. Теперь буду думать, как разрулить это в Канторе.

dragon писал(а):
Вообще раз уж есть такая тема, то заинтересованным лицам предлагаю сделать замеры, на сколько % выравнивание на 8 байт быстрее чем на 4 байта, и на каких системах соответственно.

Объективный тест не так просто придумать. Без знания теории точно не получится. :lol:

О 64-битной шине памяти я и сам думал. Тогда получается, что выравнивание рассчитывает на плохой случай -- когда данных нет в кэше. Когда же они попадают в кэш, то занимают больше места, чем теоретически могли бы занимать, не будь выравнивания. Получается игра в рулетку. Или для кэша тоже важно выравнивание?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 23 ]  На страницу Пред.  1, 2, 3  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB