Надежен ли sched_getcpu() в Linux?

Я пытаюсь устранить некоторые проблемы с производительностью с помощью pthreads в Linux и думаю, что sched_getcpu() может мне врёт. Он сообщает о постоянном ЦП для каждого потока, тогда как эксперименты по профилированию, похоже, предполагают, что потоки фактически мигрируют с одного ядра на другое в течение своего жизненного цикла.

Интересно, sched_cpu() просто сообщает о первом процессоре, на котором запущен поток, и не обращает внимания на миграцию потока? Кто-нибудь еще заметил это или видел какие-либо доказательства того, что возвращаемое значение sched_getcpu() может измениться? Если это невозможно, существуют ли какие-либо другие методы отслеживания текущего процессора (возможно, используйте CPUID?)?


person Paul R    schedule 29.04.2016    source источник


Ответы (2)


http://man7.org/linux/man-pages/man2/getcpu.2.html указывает, что sched_getcpu() — это всего лишь оболочка для getcpu().

http://man7.org/linux/man-pages/man2/getcpu.2.html предполагает, что предоставленная информация является точной, поскольку старый вариант кэширования больше не используется:

Аргумент tcache не используется, начиная с Linux 2.6.24... он указывал указатель на выделенный вызывающей стороной буфер в локальном хранилище потока, который использовался для обеспечения механизма кэширования для getcpu(). Использование кеша может ускорить вызовы getcpu() ценой очень малой вероятности того, что возвращаемая информация будет устаревшей. Считалось, что механизм кэширования вызывает проблемы при переносе потоков между процессорами, поэтому этот аргумент теперь игнорируется.

Поэтому, если вы не используете ядро ​​до версии 2.6.24, маловероятно, что вы увидите старую/кэшированную информацию.

person mc110    schedule 29.04.2016
comment
Спасибо за исчерпывающий ответ - моя версия ядра, похоже, 3.10, поэтому похоже, что я не должен видеть такое поведение. Придется копнуть глубже... - person Paul R; 29.04.2016

Вызов sched_getcpu имеет две проблемы:

  1. Он только сообщает вам, где работает поток, когда он выполняет вызов,
  2. Вызов системной процедуры может привести к миграции потока.

Если вы используете среду выполнения Intel, вы можете установить KMP_AFFINITY=verbose, так как она будет предоставлять ту же информацию (в другом формате) в stderr, когда программа выполняет свой первый параллельный раздел.

person robertm.tum    schedule 29.09.2020