тут никто не понимает как это на hardware уровне это работает и почему процессору физически надо работать с выровненными адресами?
Потому что при невыравненных адресах требуется два обращения к памяти
Это я тоже читал. Но я не понимаю почему нельзя было сделать процессор который это за раз делал бы с любыми адресами
Возможно интеловский мануал поможет
Возможно. Я просто уже много чего гуглил и тыкал, но так и не найду то, что откроет мне глаза
Не байт, а X байт (в зависимости от размера данных, и размера кэшлайна) И читаешь ты в реале кусок из кэшлайна. При выравнивании - данные попадают в один кэшлайн, и в следующий раз если ты попытаешься его прочитать - то он прочтёт из кэшлайна уже по выравненному диапазону, что будет намного быстрее. Выше поверхностно это уже и было описано
Грубо говоря, выравнивание нужно из-за особенностей работы кеша?
Покурил эту информацию Всё равно не понятно почему без выравнивания процессор будет неэфективно читать память. Допустим у нас есть массив 32 байта. Мы его положили по адресу 1. Когда обращаемся к адресу 4, то все 32 байта последовательно выгружаются в кэш начиная с адреса 4. Ну и всё Зачем выравнивать и ложить этот массив по адресу 0,32,64 и т.п. если и в теории и без выравнивания всё должно работать быстро?
"положить по адресу 4" Это разве не выровнять на 32?
Че то я теперь запутался. Я думал надо ложить по адресу, кратному размеру
Напутал, всё, Читается же по 32 бита а это 4 байта
Исправил на адрес 1
И в твоём примере: массив 32 байт при выравнивании на 1 байт ничего не даст процессору. Адрес начала будет выравнен на 1 байт, из-за чего процессору придётся *брать первую часть, вторую, отбрасывать ненужное* что неэффективно: 0xFFFF01 (выравнивание на 1) 0xFFFF04 (выравнивание на 4)
Это ведь не просто так все. Если читать блоком по 32 бита тол ко выровненными кусками то нижние биты адреса ==0 и их можно не передавать, заметно упрощая дизайн и количесвто сигнальных линий и всяких дорожек на схемах
Чего-чего? Количество сигнальных линий и дорожек на схемах?
Ну да, я в древние времена 8086 для упрощения дизайна нижние биты адресных дорожек между процессором и памятью не передавались соответственно и дорожек не было и всё было проще делать, но при этом естественно процессор работать читать только по 2 байта или по четыре не помню как
представь ситуацию комманда fidiv это 2 байта DA35 вот невыровнен код, DA попала в страницу кэша а 35 не попала как проц поймет что ему прилетело вот и будет еще раз перегружать например
Поймёт поймёт вот там есть много-много серьезный логики которая контролирует чтобы данные в кэш были когерентными, если надо загрузить два раза Он загрузит 2 раза а потом выберет нужны байты и занесет в регистр Ну а команда всё это время будет ждать
Ничего подобного. Ждать будут только зависимые команды, а процессор уже пополнит счётчик, и пойдёт вторую выполнит, пока первая выполняется
Если у команды есть загрузка из памяти прежде чем выполнять она должна её загрузить с помощью соответствующего блока загрузок и сохранение память который потом общается с кэшами всех уровней и с непосредственно контроллером оперативной памяти. Никто ничего не будет выполнять пока не придут готовые данные, разве что выполнять спекулятивно а потом обнаружить что данные не были готовы и сбросить конвейер и начать сначала, но мы сейчас вообще-то не про это
Будут-будут. Это вы в 8086 застряли
Я сейчас не обсуждаю спекулятивное выполнение конвейеризацию и выполнение вне очереди. Если процессоры нужно считать байты по невыровненному адресу или через границы кэшлиний - будет произведено 2 считывания из кэша или из памяти потом в специальных буферах данные объединяются И выбираются только Те байты которые изначально были нужны и дальше уже посылаются на выполнение как данные или как код
Выравнивание по 4 байта, а не 2. Потом он вернёт 3, если адрес не выравнен. Данные не обьединяются, а отбрасываются ненужные биты, и потом возвращаются
Двачую, даже по структуре разных служебных битовых полей видно, что младшие биты адресов выровненных блоков отбрасываются. Те же 12 бит в каталогах страниц, 6 бит в тегах кэш линий и.т.п. А каждый бит, это несколько транзисторов, так что выравнивание полезное дело: выровнял блок - спас транзистор))
Обсуждают сегодня