2010-10-11 3 views
3

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

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

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

Спасибо заранее!

ответ

11

Это не ухудшит производительность и не будет сопряжено со значительной сложностью в схеме.

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

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

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

Прямо сейчас центральный процессор и память могут быть соединены между собой так, что биты 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. Это не имеет большого значения, потому что процессор может их swizzle внутренне, используя ту же схему, что и для логического сдвига влево. Затем в следующем байте 4 памяти транзакции, который хранится в микросхеме памяти 0 со смещением 1, считывается в биты 0-7 и swizzled в биты 24-31, где вы этого хотели.

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

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

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

+1

Конечно, я не эксперт. Сожалею! С тех пор я буду следить за своими словами. Спасибо за ваш ответ, и я думаю, что это именно то, что я ищу. – spockwang

+0

+1 Это отличный ответ. –

+0

Очень хороший ответ. Стоит отметить, что в некоторых чипах для высокоскоростной графики или обработки сигналов есть подсистемы памяти, которые могут обрабатывать операции, охватывающие слова памяти. Такая вещь может быть разумно эффективно реализована в массиве памяти, если между разделами были мультиплексоры, которые заставили бы каждый раздел либо использовать ту же строку, что и предыдущий раздел, или строку под ней. Я не знаю, что когда-либо были какие-либо микросхемы памяти, которые открывали такую ​​функцию, хотя в некоторых случаях это могло бы быть приятно. – supercat

0

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

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

0

Ответ на ваш вопрос в самом вопросе.

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

Если вы получили доступ к адресу 0x0, CPU предоставит вам 4 байта от 0x0 до 0x3.

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

+1

Это даже не начинает обращать внимание, почему ЦП может «обманывать» байты 0-3 одновременно, но не 1-4. –

0

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