169 похожих чатов

И еще вопрос Вы принимаете необходимость выравнивания данных как факт? Т.е.

тут никто не понимает как это на hardware уровне это работает и почему процессору физически надо работать с выровненными адресами?

23 ответов

15 просмотров

Потому что при невыравненных адресах требуется два обращения к памяти

Dmitry-Croft Автор вопроса
Aleksandr
Потому что при невыравненных адресах требуется два...

Это я тоже читал. Но я не понимаю почему нельзя было сделать процессор который это за раз делал бы с любыми адресами

Dmitry-Croft Автор вопроса
YVEF
Возможно интеловский мануал поможет

Возможно. Я просто уже много чего гуглил и тыкал, но так и не найду то, что откроет мне глаза

Dmitry Croft
Возможно. Я просто уже много чего гуглил и тыкал, ...

Не байт, а X байт (в зависимости от размера данных, и размера кэшлайна) И читаешь ты в реале кусок из кэшлайна. При выравнивании - данные попадают в один кэшлайн, и в следующий раз если ты попытаешься его прочитать - то он прочтёт из кэшлайна уже по выравненному диапазону, что будет намного быстрее. Выше поверхностно это уже и было описано

Dmitry-Croft Автор вопроса
Алексей Шведов
Не байт, а X байт (в зависимости от размера данных...

Грубо говоря, выравнивание нужно из-за особенностей работы кеша?

Dmitry-Croft Автор вопроса
Алексей Шведов
Не байт, а X байт (в зависимости от размера данных...

Покурил эту информацию Всё равно не понятно почему без выравнивания процессор будет неэфективно читать память. Допустим у нас есть массив 32 байта. Мы его положили по адресу 1. Когда обращаемся к адресу 4, то все 32 байта последовательно выгружаются в кэш начиная с адреса 4. Ну и всё Зачем выравнивать и ложить этот массив по адресу 0,32,64 и т.п. если и в теории и без выравнивания всё должно работать быстро?

Dmitry Croft
Покурил эту информацию Всё равно не понятно почем...

"положить по адресу 4" Это разве не выровнять на 32?

Dmitry-Croft Автор вопроса
Алексей Шведов
"положить по адресу 4" Это разве не выровнять на 3...

Че то я теперь запутался. Я думал надо ложить по адресу, кратному размеру

Dmitry-Croft Автор вопроса
Алексей Шведов
"положить по адресу 4" Это разве не выровнять на 3...

Напутал, всё, Читается же по 32 бита а это 4 байта

Dmitry Croft
Покурил эту информацию Всё равно не понятно почем...

И в твоём примере: массив 32 байт при выравнивании на 1 байт ничего не даст процессору. Адрес начала будет выравнен на 1 байт, из-за чего процессору придётся *брать первую часть, вторую, отбрасывать ненужное* что неэффективно: 0xFFFF01 (выравнивание на 1) 0xFFFF04 (выравнивание на 4)

Dmitry Croft
Покурил эту информацию Всё равно не понятно почем...

Это ведь не просто так все. Если читать блоком по 32 бита тол ко выровненными кусками то нижние биты адреса ==0 и их можно не передавать, заметно упрощая дизайн и количесвто сигнальных линий и всяких дорожек на схемах

Agent
Это ведь не просто так все. Если читать блоком по ...

Чего-чего? Количество сигнальных линий и дорожек на схемах?

Алексей Шведов
Чего-чего? Количество сигнальных линий и дорожек н...

Ну да, я в древние времена 8086 для упрощения дизайна нижние биты адресных дорожек между процессором и памятью не передавались соответственно и дорожек не было и всё было проще делать, но при этом естественно процессор работать читать только по 2 байта или по четыре не помню как

Agent
Это ведь не просто так все. Если читать блоком по ...

представь ситуацию комманда fidiv это 2 байта DA35 вот невыровнен код, DA попала в страницу кэша а 35 не попала как проц поймет что ему прилетело вот и будет еще раз перегружать например

Денис Фомин Fomin
представь ситуацию комманда fidiv это 2 байта DA35...

Поймёт поймёт вот там есть много-много серьезный логики которая контролирует чтобы данные в кэш были когерентными, если надо загрузить два раза Он загрузит 2 раза а потом выберет нужны байты и занесет в регистр Ну а команда всё это время будет ждать

Agent
Поймёт поймёт вот там есть много-много серьезный л...

Ничего подобного. Ждать будут только зависимые команды, а процессор уже пополнит счётчик, и пойдёт вторую выполнит, пока первая выполняется

Алексей Шведов
Ничего подобного. Ждать будут только зависимые ком...

Если у команды есть загрузка из памяти прежде чем выполнять она должна её загрузить с помощью соответствующего блока загрузок и сохранение память который потом общается с кэшами всех уровней и с непосредственно контроллером оперативной памяти. Никто ничего не будет выполнять пока не придут готовые данные, разве что выполнять спекулятивно а потом обнаружить что данные не были готовы и сбросить конвейер и начать сначала, но мы сейчас вообще-то не про это

Алексей Шведов
Будут-будут. Это вы в 8086 застряли

Я сейчас не обсуждаю спекулятивное выполнение конвейеризацию и выполнение вне очереди. Если процессоры нужно считать байты по невыровненному адресу или через границы кэшлиний - будет произведено 2 считывания из кэша или из памяти потом в специальных буферах данные объединяются И выбираются только Те байты которые изначально были нужны и дальше уже посылаются на выполнение как данные или как код

Agent
Я сейчас не обсуждаю спекулятивное выполнение конв...

Выравнивание по 4 байта, а не 2. Потом он вернёт 3, если адрес не выравнен. Данные не обьединяются, а отбрасываются ненужные биты, и потом возвращаются

Agent
Это ведь не просто так все. Если читать блоком по ...

Двачую, даже по структуре разных служебных битовых полей видно, что младшие биты адресов выровненных блоков отбрасываются. Те же 12 бит в каталогах страниц, 6 бит в тегах кэш линий и.т.п. А каждый бит, это несколько транзисторов, так что выравнивание полезное дело: выровнял блок - спас транзистор))

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
у вас два процесса. один посылает другому сигнал. у вас есть код обоих процессов? если всё не так - расскажите как оно на самом деле. а именно кто кому чего, есть-ли консоли,...
Karagy
6
Карта сайта