| Description: |
Повышение производительности приложений является важной практической задачей для проведения суперкомпьютерных расчетов. Наряду с распараллеливанием вычислений между узлами кластера (например, средствами MPI), а также с многопоточным программированием (например, с помощью OpenMP) используется векторизация программного кода, обеспечивающая параллелизм на уровне отдельных инструкций. Набор векторных инструкций AVX-512 микропроцессорной архитектуры Intel, обладает рядом уникальных возможностей, с помощью которых можно векторизовать программный код из очень широкого спектра задач. Использование специальных масочных регистров позволяет эффективно векторизовать код, содержащий условные операторы, а использование профильной информации о вероятности выполнения операций в исходной коде позволяет выполнять преобразования кода, приводящие к еще более эффективному применению автоматической векторизации. В работе рассматривается преобразование расщепления плоского цикла по условию, когда известно, что данное условие выполняется с высокой вероятностью. Рассматриваются практические задачи, в которых присутствует данный контекст. Для этих задач выделены условия для расщепления циклов для достижения эффективной векторизации. Описанные преобразования были выполнены, а эффективность результирующего кода проверена запусками на микропроцессорах семейств Intel Xeon Cascade Lake и Intel Xeon Phi Knights Landing, представлены результаты выполнения запусков. Improving application performance is an important practical task for supercomputer calculations. Along with parallelization of calculations between cluster nodes (for example, using MPI tools), as well as multithreaded programming (for example, using OpenMP), program code vectorization is used, which provides parallelism at the level of individual instructions. The AVX-512 vector instruction set of the Intel microprocessor architecture has a number of unique features that can be used to vectorize program code from a very wide range of applications. The use of special mask registers makes it possible to effectively vectorize code containing conditional statements, and the use of profile information about the probability of performing operations in the source code allows performing code transformations that lead to even more efficient use of automatic vectorization. The paper considers the splitting transformation of a flat loop by a condition when we have knowledge about of a high probability of this condition. Practical problems in which this context is present are considered. For these problems, the conditions for splitting cycles to achieve efficient vectorization are highlighted. The described transformations were performed, and the effectiveness of the resulting code was verified by runs on microprocessors of the Intel Xeon Cascade Lake and Intel Xeon Phi Knights Landing families, the results of the runs are presented. |