Я написал очень трудоемкую многопоточную задачу, которая работает, как и ожидалось, на моем четырехъядерном 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 потоков и просто использует их повторно, что не помогло. Помимо температуры процессора, что приведет к снижению скорости работы этой машины?
источник
Ответы:
Это может быть длинным, но, возможно, разница в производительности одноядерных процессоров и / или производительности кэша между процессорами 2012 и 2016 гг. Достаточно велика, так что ядра испытывают недостаток данных и снижают производительность до тех пор, пока не смогут снова работать?
Я делаю это предположение, потому что вы указываете, что достаточно однопоточных процессов могут работать на полной скорости на всех ядрах, а простая многопоточная программа может работать на полной скорости на всех ядрах.
Это заставляет меня думать, что есть что-то в дизайне программы вашей реальной рабочей нагрузки по сравнению с тестовой многопоточной рабочей нагрузкой, которая не позволяет процессорам работать постоянно
источник
Расширение ядра /System/Library/Extensions/AppleACPIPlatform.kext контролирует много температурных и процессорных защит. Очевидно, он уже скомпилирован в вашей системе, но может быть доступен на https://opensource.apple.com (я не могу его найти, но я только быстро его просмотрел). Меня не удивит, если у Apple будут очень консервативные настройки по загрузке процессора.
источник
Всякий раз, когда ОС распознает потоки как непредсказуемые и вышедшие из-под контроля, она снижается, сохраняя стабильность оборудования и системы, модель 2012 года ведет себя иначе и в худшем случае может зависнуть. Произошло со мной плохо реализованное управление потоками, моя вина. Только не запускайте столько потоков на двухъядерном.
источник
Произошло со мной плохо реализованное управление потоками, моя вина. Только не запускайте слишком много потоков на двухъядерном процессоре.
источник