Почему неверно выровненный адресный доступ вызывает 2 или более обращений? - PullRequest
4 голосов
/ 11 октября 2010

Нормальный ответ на вопрос, почему выравнивание данных заключается в более эффективном доступе и упрощении проектирования ЦП.

Соответствующий вопрос и ответы на него здесь . И еще один источник - здесь . Но они оба не решают мой вопрос.

Предположим, что ЦП имеет степень детализации доступа 4 байта. Это означает, что процессор читает 4 байта за раз. В обоих материалах, которые я перечислил выше, говорится, что если я получу доступ к смещенным данным, скажем, по адресу 0x1, то ЦП должен будет сделать 2 доступа (один из адресов 0x0, 0x1, 0x2 и 0x3, один из адресов 0x4, 0x5, 0x6 и 0x7) и объединить результаты. Я не понимаю почему. Почему процессор не может считывать данные с 0x1, 0x2, 0x3, 0x4, когда я выдаю адрес доступа 0x1. Это не ухудшит производительность и не вызовет большой сложности в схемотехнике.

Заранее спасибо!

Ответы [ 4 ]

11 голосов
/ 11 октября 2010

Это не ухудшит производительность и не вызовет большой сложности в схемотехнике.

Это ложные предположения, которые мы принимаем как факт, которые действительно отбрасывают дальнейшее понимание.

Ваш комментарий в другом вопросе использовал гораздо более подходящую формулировку (" Я не думаю, что это будет ухудшаться" ...)

Считаете ли вы, что архитектура памяти использует много микросхем памяти параллельно для максимизации пропускной способности? И что конкретный элемент данных находится только в одной микросхеме, вы не можете просто прочитать любую микросхему, которая окажется наиболее удобной, и ожидать, что в ней будут нужные данные.

В настоящий момент процессор и память могут быть соединены вместе так, что биты 0-7 соединяются только с микросхемой 0, 8-15 с микросхемой 1, 16-23 с микросхемой 2, 24-31 с микросхемой 3. И для все целые числа N, ячейка памяти 4N хранится в микросхеме 0, 4N + 1 в микросхеме 1 и т. д. И это N-й байт в каждой из этих микросхем.

Давайте посмотрим на адреса памяти, хранящиеся в каждом смещении каждого чипа памяти

memory chip       0       1       2       3
offset

    0             0       1       2       3
    1             4       5       6       7
    2             8       9      10      11
    N            4N    4N+1    4N+2    4N+3



Таким образом, если вы загружаете из памяти байты 0-3, N = 0, каждый чип сообщает свой внутренний байт 0, все биты оказываются в нужных местах, и все отлично.

Теперь, если вы попытаетесь загрузить слово, начиная с ячейки памяти 1, что произойдет?

Сначала посмотрим, как это делается. Первые байты памяти 1-3, которые хранятся в микросхемах памяти 1-3 со смещением 0, заканчиваются в битах 8-31, потому что именно к ним прикреплены эти микросхемы памяти, даже если вы просили, чтобы они были в битах 0-23. Это не имеет большого значения, потому что центральный процессор может использовать их внутри, используя ту же схему, что и для логического сдвига влево. Затем в следующей транзакции байт 4 памяти, который хранится в микросхеме памяти 0 со смещением 1, считывается в биты 0-7 и превращается в биты 24-31, где вы хотели, чтобы это было.

Заметьте что-то здесь. Запрошенное вами слово делится на смещения, первая транзакция памяти считывается со смещения 0 трех чипов, вторая транзакция памяти читается со смещения 1 другого чипа. Вот в чем проблема. Вы должны сообщить микросхемам памяти смещение, чтобы они могли отправить вам правильные данные обратно, смещение составляет ~ 40 бит в ширину, а сигналы ОЧЕНЬ высокоскоростные. В настоящее время существует только один набор сигналов смещения, который подключается ко всем микросхемам памяти. Чтобы выполнить одну транзакцию для доступа к невыровненной памяти, вам потребуется независимое смещение (называемое адресной шиной BTW), работающее с каждым чипом памяти. Для 64-разрядного процессора вы бы изменили одну адресную шину на восемь, увеличившись почти на 300 контактов. В мире, где процессоры используют от 700 до 1300 контактов, это вряд ли можно назвать «незначительным увеличением схемотехники». Не говоря уже об огромном увеличении шума и перекрестных помех от этого множества сверхскоростных сигналов.

Хорошо, это не так уж и плохо, потому что на адресной шине может быть только максимум два разных смещения одновременно, и один всегда другой плюс один. Таким образом, вы можете обойтись одним дополнительным проводом для каждого чипа памяти, сказав в действительности либо (считайте смещение, указанное на адресной шине), либо (прочитайте смещение ниже), что составляет два состояния. Но теперь в каждом микросхеме памяти есть дополнительный сумматор, что означает, что он должен рассчитать смещение, прежде чем делать доступ к памяти, что замедляет максимальную тактовую частоту памяти. Это означает, что выравниваемый доступ становится медленнее, если вы хотите, чтобы невыровненный доступ был быстрее. Поскольку 99,99% доступа можно выровнять, это чистый убыток.

Так вот почему не согласованный доступ делится на два этапа. Потому что адресная шина используется всеми задействованными байтами. И это на самом деле упрощение, потому что, когда у вас разные смещения, у вас также задействованы разные строки кеша, поэтому вся логика когерентности кеша должна была бы удвоиться, чтобы дважды обрабатывать связь между ядрами ЦП.

0 голосов
/ 29 ноября 2010

Адресация 4 байтов с неправильным выравниванием первого байта слева в 0x1, а не 0x0 означает, что он не начинается на границе слова и распространяется на следующее смежное слово. Первый доступ захватывает 3 байта до границы слова (при условии 32-разрядного слова), а затем второй доступ захватывает байт 0x4 в режиме завершения 4-байтового 32-разрядного слова реализации адресации памяти. Объектный код или ассемблер эффективно выполняет второй доступ и объединение для программиста прозрачно. Лучше всего по возможности придерживаться границ слов обычно в единицах по 4 байта.

0 голосов
/ 11 октября 2010

Ответ на ваш вопрос находится в самом вопросе.

Процессор имеет гранулярность доступа 4 байта. Таким образом, он может обрабатывать данные только кусками по 4 байта.

Если бы вы обращались к адресу 0x0, ЦП выдал бы вам 4 байта от 0x0 до 0x3.

Когда вы выдаете инструкцию для доступа к данным с адреса 0x1, ЦПУ принимает это как запрос на 4 байта данных, начиная с 0x1 (т.е. 0x1 to 0x4).Это не может быть интерпретировано каким-либо другим способом, по существу, из-за гранулярности процессора.Следовательно, ЦП забирает данные из 0x0 to 0x3 & 0x4 to 0x7 (следовательно, 2 обращения), а затем объединяет данные из 0x1 to 0x4 в качестве окончательного результата.

0 голосов
/ 11 октября 2010

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

Однако я добавляю предостережение о том, что я не являюсь процессором или процессором памяти, поэтому могу говорить о чудовище.

...