Ускорение Векторизации И Доступа К Памяти В Dl_Meso: Примеры Оптимизации С Помощью Vectorization Advisor На Большом Проекте

Мы уже писали о Советчике по векторизации и примеры его применения на простых образцах .

Сегодня мы поделимся информацией о том, как инженеры Intel совместно с исследователями из лаборатории STFC Дарсбери в Великобритании оптимизировали пакет DL_MESO.

Ускорение векторизации и доступа к памяти в DL_MESO: примеры оптимизации с помощью Vectorization Advisor на большом проекте

ДЛ_МЕСО — научный пакет для моделирования конденсированного состояния на мезоскопическом уровне (да простят меня химики и физики, если я не совсем правильно перевел).

Пакет разработан в лаборатории Дарсбери и широко используется как в исследовательском сообществе, так и в промышленности (компании Unilever, Syngenta, Infineum).

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

Этот процесс называется «Computer Aided Formulation» (CAF) — я перевел это как «САПР в области разработки химических формул».

Моделирование CAF — это очень трудоемкая операция, поэтому разработчики сразу же заинтересовались проектом, который был бы максимально производительным.

А DL_MESO был выбран в качестве одного из совместных проектов «Центра параллельных вычислений Intel» (IPCC) между Intel и Hartree. Разработчики DL_MESO хотели воспользоваться возможностями аппаратного векторного параллелизма, поскольку будущие технологии, такие как AVX-512, потенциально могут сделать код до 8 раз быстрее для чисел двойной точности (по сравнению с невекторизованным кодом).

В этом посте мы расскажем вам, как ученые из Дарсбери использовали Vectorization Advisor для анализа кода решеточного уравнения Больцмана в DL_MESO, какие конкретные проблемы они обнаружили и как исправили свой код, чтобы разогнать его в 2,5 раза.

Профильный опрос Что такое советник по векторизации, читайте в первая статья .

Здесь мы перейдем прямо к профилю обзора компонента «Решетка Больцмана».

Около половины общего времени выполнения приходится на десять «горячих» циклов, среди которых нет явных лидеров; каждый тратит не более 12% от общего времени программы.

Эта картина близка к «плоскому профилю», что обычно вредно для программиста.

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



Ускорение векторизации и доступа к памяти в DL_MESO: примеры оптимизации с помощью Vectorization Advisor на большом проекте

Но, к счастью для разработчиков из Дарсбери, Vectorization Advisor может быстро охарактеризовать такие циклы:

  1. Векторизуемый , Но не векторизован циклы, требующие минимальных изменений кода (обычно с использованием OpenMP4.x) для включения генерации кода SIMD. В эту категорию попадают первые 4 цикла (по процессорному времени).

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

  3. Векторизованный циклы, производительность которых ограничена структурой расположения данных.

    Оптимизация таких циклов требует более серьёзной переделки кода.

    Как мы увидим позже, после устранения проблем с первыми двумя категориями это два наиболее нагруженных цикла.

  4. Векторизованные циклы, которые уже хорошо работают.
  5. Все остальные случаи (включая невекторизуемые циклы).

Советник по векторизации не только предоставляет информацию о циклах.

Вкладки «Рекомендации» и «Сведения о диагностике компилятора» позволяют узнать о конкретных проблемах и способах их решения.

В нашем случае третий хотспот («горячий» цикл, да простят меня стражи чистоты языка) в fGetSpeedSite не удалось векторизовать, поскольку компилятор не смог оценить, сколько итераций у него будет. Подробности диагностики компилятора описывают суть проблемы с примером и предложениями по ее решению — добавьте директиву «#pragma Loop count».

Следуя советам, этот цикл был быстро векторизован и переведен из категории 2 в категорию 4.

Ускорение векторизации и доступа к памяти в DL_MESO: примеры оптимизации с помощью Vectorization Advisor на большом проекте

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

Поэтому важно проверить уже векторизованные циклы на предмет их эффективности.

Простая оптимизация: заполнение вычислительного ядра «равновесного распределения»

   

int fGetEquilibriumF(double *feq, double *v, double rho)

Теги: #перевод #Intel Advisor XE #векторизацияb SIMD #кейс #Высокая производительность #разработка веб-сайтов #программирование
Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.