Я использую проект, в котором каждый раз, когда вы удваиваете количество потоков , вы увеличиваете накладные расходы от 40% до 60%. Поскольку гиперпоточность увеличивает производительность до 30%, это означает, что программа работает медленнее, чем в однопоточном режиме в системах с многопоточностью.
Первые шаги кажутся простыми.
Получить число потоков в системе с помощью len(os.sched_getaffinity(0))
Ограничить количество потоков с помощью параметров z3.
Связать потоки к физическим ядрам с использованием os.sched_setaffinity(0,mask)
.
Оставьте включенными решения smt для систем, не содержащих Intel или amd внутри platform.machine()
.
Однако несколько для этого возникают проблемы.
Как узнать, включена ли в системе гиперпоточность?
Перед использованием os.sched_setaffinity(0,mask)
, как узнать, какой Номера ядер процессора являются физическими или логическими?
Проблема в том, что в настоящее время программа поддерживает большое количество платформ через python3: все Unix, а также Windows и Osx и Openvms не забывая при этом PyPy.
Любое похлопывание ch для исправления проблемы не должен порождать новый процесс, не добавлять не включенную зависимость и не удалять поддержку для некоторых из вышеперечисленных платформ.
Что может быть чистым способом исправить это?