Пропускная способность памяти достижима на одном ядре

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

Рассмотрим следующие результаты теста STREAM (Triad) на одном процессоре Xeon E5-2680 с пиковой пропускной способностью памяти 42,7 ГБ/с (DDR3-1333):

1  core  16 GB/s
2  cores 30 GB/s
3+ cores 36 GB/s

STREAM хорошо масштабируется от 1 до 2 ядер, но выше 3 ядер производительность примерно постоянна.

Мой вопрос: что определяет пропускную способность памяти, которую может обеспечить одно ядро ​​ЦП? Поскольку этот вопрос определенно слишком широк, я сужу его до упомянутой выше архитектуры: как я могу предсказать, что STREAM с 1 потоком даст мне 16 ГБ / с, исходя из спецификаций E5-2680 или глядя на аппаратные счетчики и т. д. ?


person angainor    schedule 05.02.2014    source источник
comment
Интересно, как/влияет ли количество каналов памяти на скорость? Мой процессор с 4 каналами памяти масштабируется до 4 потоков в тесте скорости. Вы видите некоторое улучшение по сравнению с двумя потоками, и я думаю, что ваша машина также имеет 4 канала. Как поживает 2-канальная система?   -  person avl_sweden    schedule 26.07.2018


Ответы (1)


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

Для многопоточного доступа узким местом будет шина и архитектура оперативной памяти на материнской плате и северном мосту. Так что это будет зависеть от вашей материнской платы. Вы можете иметь на 50% медленнее DRAM, но 4 из них параллельно и добиться ускорения. Или наоборот.

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

Это ОЧЕНЬ глубокая тема.

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

person Martin    schedule 05.02.2014
comment
Теоретически для одного ядра потолком должна быть пропускная способность памяти. Возьмем в качестве примера процессор Intel Haswell i7-4770, пропускная способность кэш-памяти уровня L1 составляет 64 байта/цикл, а частота — 3,6 ГГц, поэтому пиковая пропускная способность одного ядра составляет 64*3,6 ГБ/с, что намного больше, чем пропускная способность памяти. . - person user334026; 16.11.2016
comment
Да, это намекает на то, что существует больше факторов, чем просто тактовая частота. - person avl_sweden; 26.07.2018