Ядро NT не использует архитектуру с несколькими каналами памяти?

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

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

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

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

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


person Duncan Gravill    schedule 12.02.2019    source источник
comment
Было бы неплохо, если бы вы добавили ссылку на упомянутую вами экспериментальную оценку.   -  person Hadi Brais    schedule 13.02.2019


Ответы (2)


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

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

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

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

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

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

person Peter Cordes    schedule 14.02.2019

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

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

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

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

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

person Brendan    schedule 13.02.2019
comment
Я думаю, что дело не в том, что большинство реальных приложений не привязаны к пропускной способности, а в том, что определенные классы рабочих нагрузок больше привязаны к пропускной способности памяти, чем другие. Например, хорошо известно, что рабочие нагрузки HPC (например, многочисленные тесты ЦП SPEC) очень чувствительны к пропускной способности памяти. Мы не знаем, о каком типе рабочих нагрузок говорит ОП. Чередование каналов настраивается, и то, как ОС распределяет физическую память, может существенно повлиять на производительность за счет потенциального дополнительного энергопотребления. - person Hadi Brais; 13.02.2019
comment
Я искал тесты, которые проверяют преимущества систем с многоканальной архитектурой памяти — первые 2 результата были в основном ориентированы на геймеров. HPC — гораздо более сложная ниша. - person Brendan; 13.02.2019
comment
@Brendan Да, авторы, похоже, озабочены играми, хотя некоторые тесты производительности имитируют обработку изображений. Мое любопытство связано с визуализацией. Сценарий, который я имею в виду, представляет собой пакетную обработку изображений большого количества (> 100) файлов изображений (RAW> 30 МБ каждый). Может быть 8 ядер с 16 потоками, каждое из которых выполняет такую ​​задачу, как увеличение изображения путем интерполяции. Каждый файл изображения больше, чем общий кэш, доступный для всего процессора. Вы говорите, что статистически маловероятно, что ядра должны загружаться из ОЗУ одновременно, поэтому прирост производительности дополнительной пропускной способности незначителен? - person Duncan Gravill; 13.02.2019
comment
@Brendan Спасибо за ваш ответ, я думаю, что мое замешательство проясняется. Является ли параллельная обработка изображений, возможно, не параллельной обработкой нескольких изображений, а распараллеливанием обработки одного изображения, чтобы наилучшим образом использовать кеш, а затем последовательно обрабатывать изображения? Если бы каждое ядро ​​параллельно обрабатывало разные изображения, то использование кеша, несомненно, было бы очень неэффективным. - person Duncan Gravill; 13.02.2019