Как получить идентификатор ЦП на многоядерном PowerPC?

У меня есть многопоточное приложение, работающее под Linux 2.6.30 на 8-ядерном процессоре PowerPC. Я хочу определить, какой процессор используется при запуске потока. Очевидный ответ — напечатать регистр специального назначения PID — ID процессора. Доступ к регистру PID осуществляется с помощью инструкции mfspr. Я пытаюсь получить к нему доступ, используя следующий asm в моей программе на C:

asm(" mfspr %0, 286 " : "=r" (cpu_no));

Проблема в том, что mfspr является привилегированной инструкцией, и даже когда это приложение запускается от имени пользователя root, оно выдает ошибку недопустимой инструкции. Эта инструкция отлично работает при выполнении в приложении на «голом железе».

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

Есть ли способ получить идентификатор ядра, на котором работает текущий поток, из процесса уровня пользователя Linux?


person Russ    schedule 13.10.2010    source источник


Ответы (2)


Будет pthread_getaffinity_np или sched_getcpu достаточно?

person Duck    schedule 13.10.2010
comment
Если я правильно понимаю, pthread_getaffinity_np вернет битовую карту ядер, на которых можно запланировать запуск потока. Я хочу знать, на каком ядре он работает. - person Russ; 14.10.2010
comment
Я думал, что вы могли бы установить сходство, прежде чем запускать поток. sched_getcpu может быть ближе к тому, что вам действительно нужно. - person Duck; 14.10.2010
comment
Фундаментальная проблема, которую я пытаюсь выяснить, заключается в том, почему приложение работает всего на 12% от ЦП (как сообщается сверху). Я установил LTTng — и для 41 из 42 потоков он сообщает, что CPUID одинаковый (варьируется от запуска к запуску, но похоже, что 41 поток сгруппирован на одном ядре). Тем не менее, средство просмотра управления потоком в lttv показывает 8 потоков одновременно в режиме выполнения, что, как я надеюсь, произойдет. - person Russ; 14.10.2010
comment
Я бы хотел, чтобы Linux определял, куда должны идти потоки, а не делал это вручную. Сначала я хочу знать (окончательно), все ли на одном ядре или они правильно распределены по ядрам. - person Russ; 14.10.2010
comment
D'oh - прочитать весь ответ !! sched_getcpu — это именно то, что я ищу. Спасибо!! - person Russ; 14.10.2010
comment
В качестве продолжения — Linux правильно распределяет потоки по нескольким ядрам — LTTng прикрепляет неверный идентификатор ядра к событиям, которые он хранит в своей базе данных трассировки. Причина плохой загрузки процессора не проблема планирования потоков, но я все еще не понимаю, в чем проблема производительности. - person Russ; 14.10.2010
comment
Приятно слышать, что одна проблема решена. У вас же нет 40 потоков, ожидающих одного и того же мьютекса, верно? - person Duck; 14.10.2010
comment
При запуске того же приложения на моем настольном компьютере (четырехъядерный i7) под Ubuntu или Windows я получаю от 75 до 80% использования. В части Freescale у меня больше ядер, но меньше использование. 40 потоков совместно используют 20 областей данных, которые индивидуально заблокированы, поэтому теоретически в среднем каждый поток будет ждать, пока только один другой поток не уйдет с дороги. Я собираюсь попробовать ограничить приложение только 4 ядрами и посмотреть, получу ли я ту же пропускную способность, что и четырехъядерный процессор Intel. В любом случае, интересная проблема - просто очень трудно понять, что происходит. Любое ведение журнала или печать сильно меняет поведение - person Russ; 14.10.2010

Другой способ — использовать реестр WHOAMI. Регистр WHOAMI возвращает идентификатор ЦП ядра, читающего его.

person Ejaz Ahmed    schedule 13.08.2014