Разве ядро ​​NT не использует архитектуру с несколькими каналами памяти? - PullRequest
0 голосов
/ 12 февраля 2019

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

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

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

Мой постулат состоит в том, что когда ядро ​​NT распределяет физическую память, оно не нарушает равномерное распределение по каналам памяти.Если вся виртуальная память процесса отображается в одном канале памяти в системе MMC, тогда процесс сможет эффективно достигать производительности только при наличии одного канала памяти в своем распоряжении.Является ли это причиной незначительного прироста производительности в реальном мире?

Естественно, что процессу выделяется виртуальная память, а ядро ​​выделяет страницы физической памяти, так что это незначительное увеличение производительности по вине ядра NT, не распределяющего распределения по доступным каналам?

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

related: Почему Skylake намного лучше, чем Broadwell-E для пропускной способности однопоточной памяти? двух контроллеров памяти достаточно для пропускной способности однопоточной памяти.Только если у вас есть несколько потоков / процессов, которые все пропускают в кеше лот , вы начинаете извлекать выгоду из дополнительных контроллеров памяти в большом Xeon.

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

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

Умножение матриц являетсяклассический пример: вместо зацикливания строк / столбцов матрицы целом N ^ 2 раза (что слишком велико для размещения в кэше) (одна точка x произведение столбцов для каждого выходного элемента) вы разбиваетеработайте с «плитками» и вычисляйте частичные результаты, так что вы будете многократно повторять циклы по плитке матрицы, которая остается горячей в кэш-памяти L1d или L2.(И мы надеемся, что узкое место в пропускной способности FP ALU, при выполнении инструкций FMA, а не в памяти вообще, потому что matmul берет O (N ^ 3) операций умножения + добавления над N ^ 2 элементами для квадратной матрицы.) Эти оптимизации называются «разбиением на петли»"или" блокировка кеша ".

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

Если одного канала DRAM достаточно для того, чтобы не отставать от запросов аппаратной предварительной выборки о том, как быстро / медленно код фактически затрагивает новую память, замедления из-за пропускной способности памяти не будет.(Конечно, это не всегда возможно, и иногда вы делаете цикл по большому массиву, выполняя не очень большую работу или даже просто копируя его, но если это составляет лишь небольшую долю от общего времени выполнения, это все равно не имеет значения.)

0 голосов
/ 13 февраля 2019

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

Думайте об этом как об иерархии, например, «CPU <-> L1 кеш <-> L2 кеш <-> L3 кеш <-> RAM <-> пространство подкачки».Пропускная способность ОЗУ имеет значение только тогда, когда кэш-память третьего уровня недостаточно велика (а пропускная способность пространства подкачки имеет значение только при недостаточном объеме ОЗУ и ...).

Для большинства (не всех) реальных приложенийкэш-память достаточно велика, поэтому пропускная способность ОЗУ не важна, а прирост (многоканального) незначителен.

Мой постулат состоит в том, что когда ядро ​​NT выделяет физическую память, это не мешает распределениюравномерно по каналам памяти.

Это не работает так.ЦП в основном работает только с целыми строками кеша (например, 64 байта);и с одним каналом вся строка кэша поступает из одного канала;и с 2 каналами половина строки кэша поступает из одного канала, а другая половина - из другого канала.Практически ничего, что может сделать любое программное обеспечение, ничего не изменит.Ядро NT работает только с целыми страницами (например, по 4 КБ), поэтому, что бы ни делало ядро, это будет иметь меньшее значение (пока вы не начнете думать об оптимизации NUMA, а это совершенно другое).

...