Оптимизация вычислений

Для сокращения количества узких мест в вычислениях почти любому базовому компоненту могут помочь следующие две оптимизации:

1. Смешивание операций с плавающей точкой. Достижение пиковой производительности работы компьютера с числами с плавающей точкой обычно требует одинакового количества практически одновременно производимых сложений и умножений. Этот баланс необходим либо потому, что компьютер поддерживает совмещенную операцию умножения-сложения, либо потому, что блок арифметики с плавающей точкой имеет одинаковое количество сумматоров чисел с плавающей точкой и мультипликаторов чисел с плавающей точкой. Более высокая производительность также требует, чтобы существенная доля смеси инструкций была представлена операциями с плавающей точкой, а не целочисленным и операциями.

2. Повышение параллелизма на уровне инструкций (ILP) и применение SIMD. Для суперскалярных архитектур наивысшая производительность достигается при извлечении, выполнении и завершении выполнения от трех до четырех инструкций за каждый тактовый цикл. Цель состоит в улучшении кода компилятора для повышения параллелизма на уровне инструкций. Один из способов достижения этого заключается в развертывании циклов. Для архитектур х86 отдельная SIMD-инструкция может работать с парами операндов двойной точности, поэтому они должны использоваться везде, где это возможно. Для сокращения количества узких мест в работе памяти могут помочь следующие две оптимизации:

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

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

Модель roofline может помочь принять решение, какую из этих оптимизаций предпринять и в каком порядке. Каждую из этих оптимизаций можно рассматривать как некий «потолок» ниже соответствующей линии крыши, означающий, что пробить потолок без осуществления связанной с ним оптимизации невозможно.

Линия крыши вычислительной производительности может быть найдена в руководствах, а линия крыши производительности памяти может быть определена путем запуска контрольной задачи Stream. Потолки вычислительной производительности, такие как баланс вычислений с числами с плавающей точкой, также берутся из руководства к компьютеру. Определение потолков производительности памяти требует проведения экспериментов на каждом компьютере, чтобы найти оптимум. Хорошо то, что этот процесс нужно провести для каждого компьютера только один раз, – как только кто-нибудь снимет характеристики потолка для данного компьютера, результатами для определения приоритетов оптимизации может воспользоваться кто угодно.

Для вычислительной производительности – на верхнем графике, а для пропускной способности памяти – на нижнем. Хотя более высокие потолки для обеих оптимизаций не помечены, но на данном рисунке они подразумеваются. Чтобы пробиться через самый высокий потолок, нужно пробиться через все потолки, расположенные ниже.

Толщина промежутка между потолком и следующим более высоким пределом будет наградой за попытку проведения этой оптимизации. Оптимизация 2, улучшающая ILP, приносит большую пользу для улучшения вычислительной производительности на данном компьютере, а оптимизация 4, улучшающая близость памяти, приносит на нем большую пользу для повышения пропускной способности памяти.

Арифметическая интенсивность базового компонента определяет область оптимизации, которая в свою очередь подсказывает, какие именно оптимизации проводить. Учтите, что для большинства показателей арифметической интенсивности вычислительные оптимизации и оптимизации пропускной способности памяти накладываются друг на друга. Например, Базовый компонент 2 попадает в более светлую трапецию справа, предлагающую поработать только над вычислительными оптимизациями. Базовый компонент 1 попадает в более темный параллелограмм в средней части графика, предлагающий попробовать оба типа оптимизаций. Кроме того, он предлагает начать с оптимизаций 2 и 4. Обратите внимание на то, что вертикальные линии базового компонента 1 попадают ниже оптимизации дисбаланса операций с плавающей точкой, поэтому необходимости в оптимизации 1 может и не быть. Если базовый компонент попадает в серый треугольник в нижней левой части графика, это станет предложением на проведения оптимизаций, касающихся только памяти.

До сих пор мы предполагали, что арифметическая интенсивность имела фиксированное значение, но на самом деле так не бывает. Во-первых, есть базовые компоненты, где арифметическая интенсивность растет по мере увеличения объема задачи, например как для задачи плотной матрицы или задачи N-тел. Разумеется, могут быть причины того, что программисты более успешно решают свою задачу при нестрогом масштабировании, чем при строгом. Во-вторых, на количество обращений к памяти влияют устройства кэш-памяти, поэтому оптимизация, улучшающая производительность кэш-памяти, также повышает арифметическую интенсивность. Один из примеров состоит в улучшении локальности, связанной со временем, за счет развертывания циклов с последующей группировкой вместе инструкций с похожими адресами. У многих компьютеров имеются специальные инструкции для работы с кэш-памятью, которые распределяют данные по кэш-памяти, но сначала они не заполняют данный адрес данными из памяти, поскольку вскоре они будут переписаны. Обе эти оптимизации сокращают трафик памяти, перемещая тем самым столбец арифметической интенсивности вправо, скажем, на полтора порядка. Это смещение вправо может поместить базовый компонент в другую область оптимизации.

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

Уточнение. Потолки, которые расположены ниже, проще пробить с помощью оптимизации. Понятно, что программист может проводить оптимизацию в любом порядке, но использование данной последовательности снижает затраты на оптимизацию, не дающую преимуществ из-за ограничений другого рода. Как и в модели трех «C», поскольку roofline -модель дает возможность проникновения в суть вопроса, у нее могут быть свои странности. Например, она предполагает, что программа загрузила все процессоры поровну.

Базовые компоненты, чья арифметическая интенсивность приходится на более светлую трапецию справа, должны сосредоточиться на вычислительных оптимизациях, а базовые компоненты, чья арифметическая интенсивность попадает в серый треугольник в левой нижней части графика, должны сосредоточиться на оптимизациях пропускной способности памяти. А те базовые компоненты, чья арифметическая интенсивность попадает в темно-серый параллелограмм, расположенный в средней части, должны позаботиться о проведении обеих типов оптимизации. Поскольку столбец базового компонента 1 попадает в параллелограмм, расположенный в средней части, нужно попробовать провести оптимизации, касающиеся ILP и SIMD, близости памяти и программной предвыборки. Столбец базового компонента 2 попадает в трапецию в правой части, поэтому нужно попробовать провести оптимизации, касающиеся ILP и SIMD, а также сбалансированности операций с плавающей точкой.

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

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



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий