Как отличить высокопроизводительные и низкопроизводительные ядра/потоки в C++?
Пожалуйста, поймите, что поток — это абстракция аппаратных возможностей и что что-то вне вашего контроля (ОС, планировщик ядра) отвечает за создание и управление этой абстракцией. Подсказки по важности и производительности являются частью этой абстракции (обычно представляются в виде приоритета потока).
Любая попытка нарушить абстракцию потока (например, определить, является ли ядро низкопроизводительным или высокопроизводительным ядром) ошибочна. Например. ОС может изменить ваш поток на низкопроизводительное ядро сразу после того, как вы обнаружите, что работаете на высокопроизводительном ядре, что заставит вас предположить, что вы используете высокопроизводительное ядро, когда это не так.
Даже привязка вашего потока к конкретному ядру (в надежде, что он всегда будет использовать высокопроизводительное ядро) может/будет иметь неприятные последствия (заставит вас выполнить меньше работы, потому что вы помешали себе использовать более быстрое, чем ничего низкое). -ядро производительности, когда высокопроизводительные ядра заняты выполнением другой работы).
Самая большая проблема заключается в том, что C++ создает худшую абстракцию (std::thread
) поверх вероятно лучшей абстракции, предоставляемой ОС. В частности, невозможно установить, изменить или получить приоритет потока с помощью std::thread
; поэтому вы остаетесь без какого-либо контроля над подсказками производительности, которые необходимы (для ОС, планировщика) для принятия правильных решений по управлению нагрузкой, производительностью и питанием.
Говоря о многопоточности, часто кажется, что потоки рассматриваются как равные.
Часто люди думают, что мы все еще используем системы с разделением времени 1960-х годов. Хватит слушать этих дураков. Современные системы не позволяют тратить процессорное время на неважную работу, пока более важная работа находится в ожидании. Эффективное использование приоритетов потоков является фундаментальным требованием к производительности. Все остальное (нагрузка, производительность и решения по управлению питанием) по необходимости находится вне вашего контроля (на другой стороне используемой вами абстракции потоков). .
person
Brendan
schedule
20.07.2021
native_handle
, и в зависимости от возвращаемого типа используйте соответствующую библиотеку для запроса этой информации (учитывая, что эта библиотека предоставляет эту информацию). Но для этого нет ни универсального, ни платформенно-независимого решения. - person t.niese   schedule 19.07.2021pthread
API. - person Yves   schedule 20.07.2021cpuset
для привязки процесса к набор процессоров. Это не поддерживает многопоточность, но, по-видимому, ваши процессы достаточно дешевы, чтобы переходить от потока к процессу нормально. - person Akshat Mahajan   schedule 21.07.2021