На современных многоядерных платформах параллельная производительность приложений, ограниченных пропускной способностью памяти, часто плохо масштабируется с количеством ядер. Обычно ускорение наблюдается до некоторого количества ядер, но после этого производительность насыщается. Синтетический пример — хорошо известный тест 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 или глядя на аппаратные счетчики и т. д. ?