Почему мой процессор не может поддерживать максимальную производительность в HPC

Я разработал подпрограмму факторизации Cholesky высокой производительности , которая должна иметь максимальную производительность около 10,5 GFLOP на одном CPU (без гиперпотока). Но есть некоторые явления, которые я не понимаю, когда проверяю его производительность. В моем эксперименте я измерил производительность с увеличением размера матрицы N, от 250 до 10000.

  • В моем алгоритме я применил кэширование (с настроенным коэффициентом блокировки), и данные всегда доступны с шагом блока во время вычисления, поэтому производительность кэша является оптимальной; Проблемы TLB и пейджинга устраняются;
  • У меня есть 8 ГБ оперативной памяти, а максимальный объем памяти во время эксперимента составляет менее 800 МБ, поэтому не происходит обмена.
  • Во время эксперимента ни один ресурсоемкий процесс, такой как веб-браузер, не запускается одновременно. Только некоторый действительно дешевый фоновый процесс работает для записи частоты процессора, а также данных температуры процессора каждые 2 секунды.

Я ожидаю, что производительность (в GFLOP) должна поддерживаться примерно в 10,5 для любого N, который я тестирую. Но значительное снижение производительности наблюдается в середине эксперимента, как показано на первом рисунке.

Частота процессора и температура процессора показаны на втором и третьем рисунке. Эксперимент заканчивается в 400 с. Когда эксперимент начался, температура была на уровне 51 градуса и быстро поднялась до 72 градусов, когда процессор занят. После этого он рос медленно до самого высокого уровня в 78 градусов. Частота процессора в основном стабильна и не падает при высокой температуре.

Итак, мой вопрос:

  • Так как частота процессора не снижалась, почему производительность страдает?
  • Как точно влияет температура на производительность ЦП? Увеличивает ли прирост от 72 до 78 градусов, что еще хуже? введите описание изображения здесь введите описание изображения здесь введите описание изображения здесь

Информация о процессоре

System: Ubuntu 14.04 LTS
Laptop model: Lenovo-YOGA-3-Pro-1370
Processor: Intel Core M-5Y71 CPU @ 1.20 GHz * 2

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0,1
Off-line CPU(s) list:  2,3
Thread(s) per core:    1
Core(s) per socket:    2
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 61
Stepping:              4
CPU MHz:               1474.484
BogoMIPS:              2799.91
Virtualisation:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              4096K
NUMA node0 CPU(s):     0,1

CPU 0, 1
driver: intel_pstate
CPUs which run at the same hardware frequency: 0, 1
CPUs which need to have their frequency coordinated by software: 0, 1
maximum transition latency: 0.97 ms.
hardware limits: 500 MHz - 2.90 GHz
available cpufreq governors: performance, powersave
current policy: frequency should be within 500 MHz and 2.90 GHz.
                The governor "performance" may decide which speed to use
                within this range.
current CPU frequency is 1.40 GHz.
boost state support:
  Supported: yes
  Active: yes

обновление 1 (контрольный эксперимент)

В моем первоначальном эксперименте процессор остается занятым, работая от N = 250 до N = 10000. Многие люди (прежде всего те, кто видел это сообщение перед повторной редакцией) подозревали, что перегрев процессора является основной причиной повышения производительности. Затем я вернулся и установил пакет lm-sensors linux для отслеживания такой информации, и действительно, температура процессора повысилась.

Но для завершения картины я сделал еще один контрольный эксперимент. На этот раз я даю CPU время охлаждения между каждым N. Это достигается путем запроса программы на паузу в течение нескольких секунд в начале итерации цикла через N.

  • для N между 250 и 2500, время охлаждения 5 с;
  • для N между 2750 и 5000, время охлаждения составляет 20 с;
  • для N между 5250 и 7500, время охлаждения 40 с,
  • наконец для N между 7750 и 10000, время охлаждения 60 с.

Обратите внимание, что время охлаждения намного больше времени, затраченного на вычисление. Для N = 10000 требуется только 30 секунд для факторизации Cholesky с максимальной производительностью, но я прошу время охлаждения 60 с.

Это, безусловно, очень неинтересный параметр в высокопроизводительных вычислениях: мы хотим, чтобы наша машина работала все время с максимальной производительностью, пока не завершится очень большая задача. Так что такая остановка не имеет смысла. Но это помогает лучше узнать влияние температуры на производительность.

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

Достижение максимальной производительности, по-видимому, исключает все эффекты, отличные от температуры. Но это действительно раздражает. В основном это говорит о том, что компьютер устает от HPC, поэтому мы не можем получить ожидаемое увеличение производительности. Тогда в чем смысл разработки алгоритма HPC?


ОК, вот новый набор графиков: введите описание изображения здесь введите описание изображения здесь

Я не знаю, почему я не мог загрузить 6-ю цифру. SO просто не позволяет мне отправлять изменения при добавлении 6-го числа. Поэтому я сожалею, что не могу прикрепить цифру частоты процессора.


обновление 2 (как я измеряю частоту и температуру процессора)

Благодаря Zboson для добавления тега x86. Следующие команды bash - это то, что я использовал для измерения:

while true
do 
  cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq >> cpu0_freq.txt  ## parameter "freq0"
  cat sys/devices/system/cpu/cpu1/cpufreq/scaling_cur_freq >> cpu1_freq.txt  ## parameter "freq1"
  sensors | grep "Core 0" >> cpu0_temp.txt  ## parameter "temp0"
  sensors | grep "Core 1" >> cpu1_temp.txt  ## parameter "temp1"
  sleep 2
done

Поскольку я не привязывал вычисление к 1 ядру, операционная система поочередно использует два разных ядра. Имеет смысл принимать

freq[i] <- max (freq0[i], freq1[i])
temp[i] <- max (temp0[i], temp1[i])

в качестве общего измерения.

Ответ 1

TL: DR: Ваше заключение верное. Высокая производительность вашего процессора нигде не приближается к его пику. Это нормально, потому что пик perf доступен только в качестве краткосрочного "бонуса" выше его номинальной устойчивой производительности.


Из информации о CPU, которую вы опубликовали, у вас есть двухъядерный с гиперпотоком Intel Core M с номинальной устойчивой частотой 1,20 ГГц, Его максимальный турбонаддув составляет 2,9 ГГц, а устойчивая частота TDP-up составляет 1,4 ГГц.

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

Процессоры для настольных компьютеров и серверов (Xeon и i5/i7, но не i3) все еще имеют турбо, но устойчивая частота намного ближе к максимальному турбонаддуву. например a Haswell i7-4790k имеет устойчивую "номинальную" частоту 4,0 ГГц. На этой частоте и ниже она не будет использовать (и конвертировать в тепло) больше, чем ее номинальный TDP 88 Вт. Таким образом, ему нужна система охлаждения, которая может обрабатывать 88 Вт. Когда мощность/ток/температура позволяют, он может работать до 4,4 ГГц и использовать более 88 Вт мощности. (Скользящее окно для расчета истории питания для поддержания постоянной мощности с 88 Вт иногда настраивается в BIOS, например, 20 секунд или 5 секунд. В зависимости от того, какой код работает, 4.4 ГГц может не увеличивать потребность в электрическом токе в любом месте около пика. код с множеством неверных прогнозов, которые по-прежнему ограничены частотой процессора, но это нигде не приближается к насыщению 256-битных модулей AVX FP.)

Ваш ноутбук max turbo является фактором в 2,4 раза выше, чем номинальная частота. Этот высокопроизводительный процессорный процессор Haswell для настольных ПК может работать только в 1,1 раза. Максимальная постоянная частота уже довольно близка к максимальным пределам пиковой нагрузки, поскольку она рассчитана на необходимость хорошей системы охлаждения, которая может не отставать от такого рода производства тепла. И надежный источник питания, который может обеспечить такой ток.

Цель Core M - иметь процессор, который может ограничиться сверхнизкими уровнями мощности (номинальный TDP 4,5 Вт на частоте 1,2 ГГц, 6 Вт на 1,4 ГГц). Таким образом, производитель ноутбуков может безопасно разрабатывать систему охлаждения и подачи энергии, которая мала и легка, и обрабатывает только эту мощность.


Достижение максимальной производительности, по-видимому, исключает все эффекты кроме температуры. Но это действительно раздражает. В основном это говорит что компьютер устает в HPC, поэтому мы не можем ожидать прирост производительности. Тогда в чем смысл разработки алгоритма HPC?

Дело в том, чтобы запускать их на аппаратном обеспечении, которое не так сильно ограничено термином! Процессор с ультранизким энергопотреблением, такой как Core M, является достойной платформой для разработчиков, но не является хорошей вычислительной платформой HPC.

Даже ноутбук с процессором xxxxM, а не процессор xxxxU, будет работать нормально. (например, "игровой" или "рабочей станции", который предназначен для работы с интенсивным процессором в течение продолжительных периодов времени).

Ответ 2

(Мой собственный ответ был сделан через 10 месяцев моего вопроса: эта часть моего ответа предоставляет читателям некоторый полезный справочник по частоте процессора. В другой части будет некоторый код оболочки Linux для проверки и формирования частоты процессора.)

Как уже было описано, мы уже знаем, что:

  • Частота процессора может изменяться в диапазоне. Любая модель ЦП имеет устойчивую частоту, также называемую базовой частотой, но ее текущая частота может быть либо ниже, чем из-за частотного масштабирования, либо выше, из-за "турбоподдержки" (это то, что называет это Intel);
  • На машине (заметьте, я говорю на данной машине, а не на машинах, где другие факторы, такие как конвейер, кеш и т.д., могут иметь значение), частота процессора влияет на производительность. Более высокая частота дает более высокую производительность;
  • Более высокая частота приводит к большему потреблению энергии, поэтому генерирует больше тепла. Даже если процессорный вентилятор работает более интенсивно (его можно услышать), температура процессора может увеличиться;
  • Если температура слишком высокая, CPU должен прекратить генерировать чрезмерное тепло, уменьшая частоту, что может привести к ухудшению наблюдаемой производительности.

ОК, это объясняет хорошо. Но где этот вопрос исходит вообще? Почему машина не использует одну фиксированную частоту?

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

Так почему? Я не эксперт в области аппаратного дизайна, но из-за некоторого быстрого чтения одна причина (может быть, и самая важная): мобильное устройство имеет батарею, и важно, чтобы процессор работал так, что делает жизнь как можно дольше. Таким образом, масштабирование частоты процессора произошло.

Изначально идея заключалась в том, что мы можем поддерживать работу процессора на более низкой частоте, если нет большой рабочей нагрузки. Другими словами, процессор должен работать только в полной мощности, когда это действительно необходимо. Поэтому рабочая (или текущая) частота процессора может быть ниже, но не больше, чем устойчивая (или базовая) частота. Это называется динамическое масштабирование частоты процессора. Это "масштабирование" по мере изменения частоты дискретных шагов. Другими словами, будет только несколько дискретных, известных значений, которые могут быть на частоте. Масштабирование частоты процессора в ядре Linux хорошо представлено в следующих ссылках:

Однако на более поздних мобильных станциях частота процессора может быть выше, чем устойчивая частота. Это называется turbo boost в терминологии Intel, ранее известной как "Intel Dynamic Acceleration (ida) ". Новая функция, добавленная в масштабирование частоты, заключается в том, что теперь рабочая частота процессора также может зависеть от рабочей частоты других процессоров. Итак, эта концепция появилась, когда на рынок вышли многоядерные ноутбуки. Хорошим примером для понимания мотивации этой технологии является Arjan van de Ven:

Turbo существует, потому что в многоядерной системе можно запускать одно ядро ​​быстрее, чем частота, которая находится на ярлыке окна при покупке процессора. Это связано с бюджетом власти; когда вы покупаете 35-ваттный процессор TDP, процессор не должен использовать более 35 Вт. Итак, если у вас есть, скажем, 4 ядра, это означает, что каждое ядро ​​само по себе может использовать чуть меньше 9 Вт, чтобы соответствовать этому бюджету.

Но если 3 из 4 ядер простаивают... одно оставшееся ядро ​​может использовать все 35 Вт. Если это одиночное ядро ​​будет ограничено до 9 Вт вместо полного 35 Вт, даже если остальные не работают, большая часть потенциальной производительности остается на столе.

ОК, это имеет смысл, но именно это вызывает проблему, как в моем вопросе. Заметьте, я делал бенчмаркинг в одноядерном режиме, где у меня есть два доступных ядра. Ответ Питера обобщил мою конфигурацию процессора:

  • Устойчивая/базовая частота составляет 1,4 ГГц, но при "турбобазе" она может достигать 2,9 ГГц в течение короткого периода времени;
  • Из одного из графиков моего вопроса о частоте процессора эта пиковая частота может длиться около 50 секунд. Затем мы увидели, что он опустился примерно до 2,4 ГГц, а затем, наконец, до 1,4 ГГц.

Ответ 3

(Мой собственный ответ был сделан через 10 месяцев моего вопроса: в этой части мы играем с некоторым кодом оболочки Linux, чтобы лучше понять эту проблему.)

Позвольте мне сначала показать, как получить устойчивую/базовую частоту. Это настолько важно, что у процессора нет проблем для поддержания производительности с этой частотой.

grep "model name" /proc/cpuinfo

Это возвращает имя модели ЦП, а также ее помеченную, устойчивую частоту.

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

  • Intel Core 2 Duo T6500 @2.10GHz;
  • Intel Core M-5Y71 @1.20GHz (тот, который используется в моем исходном вопросе).

Почему эти две машины? Из моего предыдущего ответа должно быть ясно, что это не динамическое масштабирование частоты процессора, а "Intel turbo boost", которое разрушает устойчивую производительность. Как уже упоминалось в моем предыдущем ответе, только более поздние ноутбуки имеют эффективный "turbo boost" . Более старый Core 2 Duo не имеет такой функции, в то время как новый Core M-5Y71 имеет. Поэтому неудивительно, что проблема, о которой сообщалось в моем вопросе, не была найдена на Core 2 Duo.

Фактически существует формальный способ проверить, имеет ли ноутбук функцию "turbo boost" , запросив CPUID. Флаг ida (Intel Dynamic Acceleration) отвечает за "turbo boost" . Все флагов ЦП можно легко найти с помощью

grep flags /proc/cpuinfo

Я вижу ida на Core M-5Y71, но не на Core 2 Duo. (Внимание: если вы это сделаете на настольных компьютерах, вы также можете увидеть флаг ida, но это означает только то, что процессор изготовлен с такой поддержкой технологии, но фактически не реализован на рабочем столе. Помните, что настольные компьютеры имеют фиксированную частоту. )


Теперь давайте узнаем больше о частоте процессора наших процессоров. В Linux информация о процессоре находится по адресу:

/sys/devices/system/cpu

где мы можем увидеть список доступных ЦП (физических или логических) в разных каталогах, например cpu0, cpu1 и т.д.

  • Для всех ЦП, отличных от cpu0, мы можем настроить его как в онлайновом, так и в автономном режиме. Это полезно при отключении гиперпоточности, но вне темы в этом сообщении;
  • Каждый процессор имеет информацию о кеше в подкаталоге cache. Здесь мы можем узнать информацию о кеше и топологию машины. Здесь также не по теме;
  • В этом разделе находится подкаталог cpufreq, содержащий важную информацию о частоте процессора. (Внимание: вы знаете, что я говорю о ноутбуках здесь. На настольных компьютерах, возможно, нет такого подкаталога, поскольку частота процессора фиксирована!!)

Теперь возьмем cpu0 в качестве примера и посмотрим на:

/sys/devices/system/cpu/cpu0/cpufreq

На разных ноутбуках мы можем видеть разные файлы. Руководство пользователя частоты ядра ядра Linux перечисляет и объясняет несколько файлов, но не все они существуют на некоторых машинах. В качестве примера приведу два ноутбука. На Core 2 Duo я получаю:

affected_cpus               freqdomain_cpus                scaling_governor
bios_limit                  related_cpus                   scaling_max_freq
cpuinfo_cur_freq            scaling_available_frequencies  scaling_min_freq
cpuinfo_max_freq            scaling_available_governors    scaling_setspeed
cpuinfo_min_freq            scaling_cur_freq
cpuinfo_transition_latency  scaling_driver

в то время как на Core M-5Y71 у меня примерно одинаковое, но с некоторой разницей:

  • Core M-5Y71 использует UEFI, а не BIOS, поэтому нет bios_limit;
  • scaling_available_frequencies отсутствует, как в ida, частота процессора может плавно изменяться не дискретно.

Теперь подведем итог общим словам:

  • cpuinfo_cur_freq (нужен root-доступ), а scaling_cur_freq - текущая частота процессора. В моем первоначальном вопросе я использовал scaling_cur_freq для экспорта текущей частоты процессора;
  • cpuinfo_max_freq и cpuinfo_min_freq дают физическую максимальную/минимальную частоту этого CPU. На Core 2 Duo максимальная/минимальная физическая частота составляет 2,10 ГГц /1,20 ГГц, ограниченная устойчивой частотой 2,10 ГГц; в то время как на Core M-5Y71, это 2,90 ГГц /500 МГц, где устойчивая частота 1,20 ГГц находится между ними;
  • scaling_max_freq и scaling_min_freq дают регулируемый частотный диапазон, используемый для масштабирования частоты. По умолчанию они равны cpuinfo_max_freq и cpuinfo_min_freq, но вы можете настроить его. Это может быть полезно, если вы хотите исправить частоту процессора на уровне;
  • scaling_available_governors и scaling_governor предоставляют доступный режим и текущий режим управления частотой. Я видел много сообщений об использовании режима "производительности" и "ondemand" на Unix и Linux, Superuser и Спросить Ubuntu;
  • scaling_driver здесь интереснее. Один Core 2 Duo, он дает acpi-cpufreq, а на Core M-5Y71 - intel_pstate, что обычно связано с "turbo boost" .

Хорошо, теперь настало время спросить: можно ли отключить "turbo boost" ? Да. На машине с технологией "turbo boost" есть подкаталог intel_pstate в основном каталоге CPU /sys/devices/system/cpu. I.e, проверяем:

/sys/devices/system/cpu/intel_pstate

В Core M-5Y71 я вижу следующие три файла (конечно, этот подкаталог не существует на Core 2 Duo):

max_perf_pct    min_perf_pct    no_turbo

Первые два управляют размером шага, используемым во время повышения (я вижу соответственно 100 и 17), в то время как окончательный файл no_turbo управляет отключением "turbo boost" . 0/1 означает "нет" / "да" для "turbo boost" . Конечно, я вижу 0 здесь, и теперь я хочу установить его в 1.

Для этого добавим следующий файл в /etc/rc.local:

echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo

(Прочитайте мои Q и A на rc.local: В чем разница между /etc/rc.local и ~/.bashrc?, если какой-либо читатель нуждается в некоторых объяснения.)

После перезагрузки системы эта настройка вступит в силу и останется. Теперь, если я снова запустил факторизацию Cholesky script, я вижу, что частота процессора фиксируется на частоте 1,40 ГГц во время бенчмаркинга, в то время как температура процессора никогда не превышает 53 ° C. Это гарантирует, что мы не получим никакого ложного контрольного заключения.