2010-10-13 5 views
3

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

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

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

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

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

ответ

3

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

+0

Если мое понимание верное, pthread_getaffinity_np вернет бит-карту ядер, на которых может быть запланирован запуск потока. Я хочу знать, в каком ядре он работает. – Russ

+0

Я думал, что вы можете установить близость, прежде чем запускать поток. sched_getcpu может быть ближе к тому, что вы действительно хотите. – Duck

+0

Основная проблема, которую я пытаюсь понять, - это то, почему приложение работает только на 12% от CPU (как сообщается сверху). Я установил LTTng - и для 41 из 42 потоков он сообщает, что CPUID тот же (варьируется от run to run, но похоже, что 41 поток сгруппирован на одном ядре). Тем не менее, средство просмотра управления потоком в lttv одновременно показывает 8 потоков в режиме запуска, что, я надеюсь, произойдет. – Russ

-1

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

Смежные вопросы