Нижегородский государственный университет им. Н.И.Лобачевского
Опубликован: 30.05.2014 | Доступ: свободный | Студентов: 303 / 35 | Длительность: 11:26:00

Лекция 5: Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel C/C++ Compiler

Балансировка нагрузки

Одним из существенных моментов, на которые следует обратить внимание при оптимизации приложений для Intel Xeon Phi, является балансировка нагрузки. В рамках данного раздела приведены только некоторые рекомендации касательно эффективного распределения логических потоков по вычислительным модулям сопроцессора.

Сопроцессор Intel Xeon Phi позволяет запускать одновременно 4 логических потока на ядро. Однако часто бывает эффективнее запускать меньшее их количество, т.к.:

  • это позволяет минимизировать нагрузку на кэши разных уровней (L1, L2, TLB), т.к. если потоков на ядре много, они начинают соперничать за доступ в кэш;
  • меньше соревнований между потоками за единственный векторный модуль ядра;
  • уменьшаются запросы к основной памяти.

Существуют доводы и за использование 4-х потоков на ядро:

  • можно получить преимущества от локальности данных при обращении в основную память и в кэш (когда все потоки используют одни и те же данные, которые удается загрузить в кэш);
  • хорошо подходит для задач, требующих больших вычислительных ресурсом и не требующих много памяти.

Таким образом:

  • в силу специфики архитектуры ядра сопроцессора при использовании 1 потока на ядро сопроцессор будет простаивать минимум половину времени , соответственно в большинстве случаем использование 2-х потоков на ядро будет эффективнее, нежели использование 1-го потока;
  • для большинства приложений подойдет использование 3-х потоков на ядро (экспериментальные данные специалистов компании Intel [5.11]);
  • для приложений с хорошей локальностью данных и большими требованиями к вычислительным ресурсам лучше использовать 4 потока на ядро.

Отметим, что в режиме offload OpenMP обычно не использует ядро с номером 0 в целях повышения производительности, т.к. на нем работает операционная система и различные сервисы.

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

Возможные варианты:

  • KMP_AFFINITY="compact"

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

  • KMP_AFFINITY="scatter"

    Потоки равномерно распределяются по ядрам. Подходит для максимального использования системных ресурсов.

  • KMP_AFFINITY="balanced"

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

Дополнительные рекомендации

Дополнительные рекомендации по оптимизации приложений для Intel Xeon Phi касаются эффективной работы с памятью:

  • Следует позаботиться о выравнивании данных в памяти.

    Для статических данных используйте модификатор __attribute__((aligned(n))) .

    Для работы с динамической памятью нужно применять функции __mm_aligned_malloc(size, alignment_bytes) и __mm_aligned_free().

    Подробнее о способах выравнивания данных смотрите в разделе 2.5.

  • Следует использовать такие структуры данных, которые лучше всего соотносятся с шаблонами доступа к ним во время вычислений. Например, часто лучше использовать структуры массивов вместо привычных в языках C/C++ массивов структур [5.12]. Применение правильных структур данных позволяет существенно повысить эффективность работы с кэш памятью.
  • Сопроцессор Intel Xeon Phi имеет аппаратное устройство предвыборки. Компилятор также генерирует указания для предвыборки автоматически. Однако для некоторых задач с нерегулярным доступом к данным лучше делать предвыборку самостоятельно. Для этого применяется функция _mm_prefetch(char* addr, int hint). Заметим, что предвыборку лучше не делать для L1 кэша, т.к. обычно это не эффективно.
  • Следует обратить внимание на эффективное использование кэшей L1 и L2, т.к. стоимость доступа в память более чем в 10 раз медленнее, чем в кэш L2.
  • Следует использовать страницы памяти размеров 2 МБ в приложениях с большими структурами и частыми обращениями к памяти для минимизации количества промахов TLB кэша.

Дополнительную информацию о программировании и оптимизации приложений для Intel Xeon Phi можно найти по ссылке [5.16].

Svetlana Svetlana
Svetlana Svetlana

Здравствуйие! Я хочу пройти курс Введение в принципы функционирования и применения современных мультиядерных архитектур (на примере Intel Xeon Phi), в презентации самостоятельной работы №1 указаны логин и пароль для доступ на кластер и выполнения самостоятельных работ, но войти по такой паре логин-пароль не получается. Как предполагается выполнение самосоятельных работ в этом курсе?