как расположена логическая память в физической?

NataNata

Пытаюсь разобраться с тем, как устроена работа с памятью на уровне железа.
Из википедии удалось выяснить, что втыкаемая в мать планка памяти состоит из некоторого количества банков, доступ к которым происходит независимо. Каждый банк памяти представляет собой матрицу N*M, причем в каждом банке имеется кэш, размером со строку. При обращении к банку памяти к строке x, данная строка целиком копируется в кэш, поэтому последовательные обращения в ячейкам одной строки идут быстро.
Однако, как функционирует вся эта кухня в случае многих каналов не совсем понятно.
Рассмотрю модельную ситуацию. Пусть имеется 2 планки памяти, работающие в двухканальном режиме доступа (unganged, т.е. доступ к планкам памяти идет независимо). Каждая память содержит 2 банка памяти (для наглядности - две физически отдельные микросхемы). Банки памяти организованы в виде двумерных массивов ячеек размером 2х2.

.a11.a12. .b11.b12. .c11.c12. .d11.d12.
.a21.a22. .b21.b22. .c21.c22. .d21.d22.
__банк_1_ __банк_2_ __банк_1_ __банк_2_
_____планка_1______ _____планка_2______
Правильно ли я понимаю, что расположение логических 16 байт (т.е. с точки зрения программы) в физической памяти следующее?

..1...2.. ..3...4.. ..5...6.. ..7...8..
..9..10.. .11..12.. .13..14.. .15..16..
__банк_1_ __банк_2_ __банк_1_ __банк_2_
_____планка_1______ _____планка_2______
По-моему, именно такое расположение обеспечивает максимально быстрый доступ к памяти, если я все верно понял из обрывков инфомации в инете (про interleaving и тд и исходя из логики работы процессорного кэша.
з.ы. буду рад любым статьям, в которых все разложено по полочкам

Anturag

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

NataNata

Раз пытаешься разобраться и читаешь википедию, то продолжай ботать, будут вопросы — спрашивай, но не вопрос в топике.
Спасибо за очевидную ссылку, но - это не то. Я сейчас прогаю для GPU, которое, как известно, умеет без помощи процессора лезть в RAM и доставать все, что ему нужно. И как бы не очевидно, что размеры запросов GPU к памяти будут обязательно кратны стандартным 4-м килобайтам.
з.ы. не стреляйте в пианиста, он формулирует вопросы, как умеет 8D

Dasar

Я сейчас прогаю для GPU, которое, как известно, умеет без помощи процессора лезть в RAM и доставать все, что ему нужно.
Механизм трансляции адресов там скорее всего тоже есть, а у тебя он пропущен. И термин "логическая" обычно употребляется по отношению к памяти после трансляции адресов.
И как бы не очевидно, что размеры запросов GPU к памяти будут обязательно кратны стандартным 4-м килобайтам.
в смысле?

Anturag

Я сейчас прогаю для GPU, которое, как известно, умеет без помощи процессора лезть в RAM и доставать все, что ему нужно.
Умение без помощи процессора лезть в RAM — этого слишком мало. Либо на GPU есть свой integrated memory controller, и тебе нужно читать про него, либо доступ к памяти идёт через north bridge.
И как бы не очевидно, что размеры запросов GPU к памяти будут обязательно кратны стандартным 4-м килобайтам.

Я подозреваю, что и в случае собственного контроллера памяти, его всё же не идиоты делали, а с задумкой на оптимизацию производительности, и доступ будет длиной в cache line.
Причём здесь какая-то "логическая память" я так и не понимаю.

elenangel

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

Dasar

То есть, тебе не нужно будет указывать GPU на какой провод какое напряжение подать на сколько наносекунд.
в таких задачах интересует, что является реальной элементарной операцией. Или другими словами, сколько будет реально считано данных при запросе одного байта, и как будет выглядеть функция скорость_выборки_данных(длина запроса, начальный адрес а также функция скорость_выборки_данных(набор запросов к памяти)

Anturag

То есть, тебе не нужно будет указывать GPU на какой провод какое напряжение подать на сколько наносекунд.
И во избежание путаницы, именно этим и занимается memory controller, а не GPU.

NataNata

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

Serab

если уж знать, как устроена память, так уж - знать до тонкостей.
дреппера читал? http://www.akkadia.org/drepper/cpumemory.pdf там прямого ответа на твой вопрос может и не быть, но там про тонкости, да и вообще очень много полезного.

SPARTAK3959

И как бы не очевидно, что размеры запросов GPU к памяти будут обязательно кратны стандартным 4-м килобайтам.

Запросы GPU к GPU-памяти судя по CUDA-мануалу могут быть 128, 64 и 32 байта (что из этого поддерживается зависит от GPU). С системной памятью скорее всего тоже самое.

dgaf

Я больше полугода уже занимаюсь моделированием контроллеров памяти, многие штуки до сих пор не понимаю, расскажу что знаю.
В основном занимаюсь тренировкой памяти - это когда биос ещё ничего не знает про память и настраивает много параметров, чтобы с памятью наконец можно было работать.
Не, планки расположены подряд без перекрытий. То есть если у тебя две планки по 1Г, то первый Г - это первая планка. Как работает interleaving ещё не читал.
лезет в память в обход процессора - ты имел ввиду DMA. В обход контроллера, конечно, не пройти, проводки-то к нему идут.
Дреппер молодец, но у него описана только база, он об этом и предупреждает, что это грубое упрощённое приближение. В реале всё довольно сложно и частью секретно.
Ты, наверное, вот это хочешь
http://en.wikipedia.org/wiki/Memory_geometry
и http://www.ece.umd.edu/courses/enee759h.S2003/lectures/Lectu...

Serab

То есть если у тебя две планки по 1Г, то первый Г - это первая планка.
т.е. на уровне dual channel'а interleaving не применяется?

Anturag

Тебя i386 интересует, верно? Тогда чтобы ответить на твой вопрос надо читать спеки, если они публично доступны, на конкретный чип northbridge, главу про memory controller.
Если по спеке есть возможность настроить memory controller так, чтобы был interleaving, то значит есть такая фича, которая в принципе может и не использоваться вообще. Как догадываюсь про i386, саму настройку контроллера памяти делает BIOS, и скорее всего из запущенной операционки можно прочитать конфигурацию контроллера памяти.

dgaf

Не, я же говорю, не знаю как interleaving работает.
Но я тут подумал. Я просто сделал поспешные выводы, вспомнив код биоса, где использовалась схема безе чередования. В том месте где она использовалась, делать чередование слишком сложно и не нужно. Я думаю, что оно потом после инициализации памяти переводит память в режим чередования и тогда какие-то небольшие блоки будут чередоваться.
То есть, ТС нарисовал верную схему, в случае, если канальное чередование по 4 байта, а чередование по банкам по два байта. Скорее всего, там блоки больше.

Anturag

Я думаю, что оно потом после инициализации памяти переводит память в режим чередования
А что это "оно"? В общем случае по вполне очевидным причинам память инициализируется всего один раз, из моей практики в дальнейшем могут меняться только параметры, связанные с энергопотреблением — частота, voltage, переход/выход в/из suspend и т.д.

dgaf

Нет, такая документация не публична, она нужна-то почти только биос девелоперам.
А без спеки разбираться что означает каждый байт - это _сложно_. Да и доступ к этим девайсам от ОС закрыт.

dgaf

Ну правильно, оно - биос.

NataNata

Да, таки в интеловских доках в чипсетах за 2009-ый год нашел инфу в разделе про northbridge о том, как все устроено (в том чипсете). В принципе, я был прав в своем первом после, с точностью до того, что квант равен 8 байтам. То есть, скажем, r9..r0, b2...b0, c9..c3, h, c2..c0, где r - адрес строки, b - адрес банка, c - адрес столбца, а цифра означает бит.
Согласен, что способ адресации может определяться железом.
Оставить комментарий
Имя или ник:
Комментарий: