Я разработал подпрограмму факторизации 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])
в качестве общего измерения.