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