Многопоточная интенсивная загрузка ЦП ограничивает возможности ЦП до температурных пределов


21

Я написал очень трудоемкую многопоточную задачу, которая работает, как и ожидалось, на моем четырехъядерном MacBook Pro 2012 года. Я отключаю его с помощью 20 потоков, и температура достигает примерно 100 ° C, что измеряется с помощью Intel Power Gadget с минимальным дросселированием.

Возьмите ту же самую программу и файлы данных на свой 13-дюймовый MacBook Pro 2016 года с двухъядерным процессором и запустите его. Я ожидаю, что он также будет поддерживать 3,3-3,4 ГГц, пока температура не достигнет отметки 100 ° C. Команда top показывает задачу на уровне 350% (2 ядра на каждой из двухпоточных), но частота процессора снижается до 1,6-1-8 ГГц при температуре только около 60 ° C или около того, когда вентиляторы работают практически бесшумно. Если запустить 4 отдельных Задачи однопоточного процессора, машина ведет себя, как и ожидалось, поддерживая частоту 3,3-3,4 ГГц, пока не достигнет 100 ° C, и вентиляторы не начнут вращаться. Вопрос в том, почему дросселируется мой процессор?

Обе машины обновлены и работают с одинаковыми версиями gcc. Если я даже возьму бинарный файл с рабочей машины и поставлю его на Mac 2016 года, у него будет та же проблема.

Если я запускаю 3 или 4 отдельных потока процессора, чтобы машина работала на полной скорости, затем запускаю многопоточную программу, она также замедляет частоту.

Обе машины имеют 16 ГБ оперативной памяти.

редактировать

Поиграв с кодом, я подозреваю, что он удушается, когда задача создает слишком много потоков. В этой программе я беру каждую прочитанную запись и создаю для нее ветку. Я позволяю только 20 или около того потокам работать одновременно, поэтому ни в коем случае не бывает более 21 потока, но необходимо обработать 14 400 000 записей, поэтому в течение примерно 30 минут каждая из этих записей будет обрабатываться отдельным потоком.

Я создал тривиальную программу pthread, которая высасывала процессорное время и запускала 10 из них. Проблемный ноутбук запустил его и нагрелся до 95С без проблем.

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

Обновление 13.05.17

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


1
Мне нравится этот вопрос! Как насчет запуска другой конкретной многопоточной задачи? Я бы предложил запустить что-то вроде задачи ffmpeg (для видео 1080p или 4K, чтобы убедиться, что оно использует все доступные ресурсы ЦП) и посмотреть, не снизится ли оно. Это может сузить проблему до: вашей программы на этом компьютере или всех многопоточных программ на этом компьютере
NoahL

1
Если я запускаю тест Cinebench R15, он использует многопоточные задачи и работает как положено, температура поднимается примерно до 100C, и вентиляторы включаются. Intel Power Gadget показывает, что частота процессора все еще находится на уровне около 3,3 ГГц. Так что это не похоже на аппаратную проблему. Весь код - это просто C-код, и ничего такого, что можно использовать с помощью p_threads и минимальных блокировок Mutex. Программа в основном обрабатывает последовательность ДНК с одним потоком, набирающим около 16 гигабайт данных и передающим его n отдельным потокам для обработки большого числа.
markatlnk

1
Похоже, что другие программы могут достичь потолка, к которому вы стремитесь? Если проблема связана с вашим специальным кодом, нам может потребоваться дополнительная информация об этом коде. Хотя где ваши данные будут обрабатываться? Внешний? Сколько работы сообщает kernel_task? Другие датчики температуры?
LаngLаngС

1
Ваш ЦП имеет 8 логических ядер, а не 4, поэтому 4 потока будут показывать 50% общего использования ЦП. Интересно, влияет ли это на оценку нагрузки вашей системы.
Судо

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

Ответы:


1

Это может быть длинным, но, возможно, разница в производительности одноядерных процессоров и / или производительности кэша между процессорами 2012 и 2016 гг. Достаточно велика, так что ядра испытывают недостаток данных и снижают производительность до тех пор, пока не смогут снова работать?

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

Это заставляет меня думать, что есть что-то в дизайне программы вашей реальной рабочей нагрузки по сравнению с тестовой многопоточной рабочей нагрузкой, которая не позволяет процессорам работать постоянно


0

Расширение ядра /System/Library/Extensions/AppleACPIPlatform.kext контролирует много температурных и процессорных защит. Очевидно, он уже скомпилирован в вашей системе, но может быть доступен на https://opensource.apple.com (я не могу его найти, но я только быстро его просмотрел). Меня не удивит, если у Apple будут очень консервативные настройки по загрузке процессора.


3
AFAIK Apple, кексы не с открытым исходным кодом. (Странно?) Лучший ресурс для информации об этом - сообщество Hackintoshing из-за необходимости вводить драйверы.
JMY1000

Совсем не странно! Тинкеры дают лучший совет, потому что знают намного больше, чем должны были из первых рук. Что касается консервативных настроек процессора, помните, что MBP имеет отличный радиатор для пакетной производительности, но не так хорош для устойчивых циклов. Вполне вероятно, что эта проблема связана с тем, что Apple хочет предупредить приготовление ваших ног. Я слышал о нескольких судебных процессах по этому поводу с 2012MBP.
user1901982

0

Всякий раз, когда ОС распознает потоки как непредсказуемые и вышедшие из-под контроля, она снижается, сохраняя стабильность оборудования и системы, модель 2012 года ведет себя иначе и в худшем случае может зависнуть. Произошло со мной плохо реализованное управление потоками, моя вина. Только не запускайте столько потоков на двухъядерном.


-2

Произошло со мной плохо реализованное управление потоками, моя вина. Только не запускайте слишком много потоков на двухъядерном процессоре.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.