Как я могу получить число ядра процессора из приложения пространства пользователя (Linux, C)?

Исторически проверка была забыта для добавления в компилятор. Когда он был обнаружен, я предлагаю сделать ошибку компиляции, но это оказалось предупреждением по причинам обратной совместимости. См. https://github.com/Microsoft/visualfsharp/pull/5192 и https://github.com/Microsoft/visualfsharp/pull/5610 для получения подробной информации.

17
задан Jonas 10 May 2010 в 08:55
поделиться

4 ответа

Используйте sched_getcpu для определения ЦП, на котором работает вызывающий поток. См. man getcpu (системный вызов) и man sched_getcpu (обертка библиотеки). Однако отметьте то, что это говорит:

информация, помещенная в CPU, как только гарантируют, будет текущей во время вызова: если привязка ЦП не была зафиксирована с помощью sched_setaffinity (2), ядро могло бы изменить ЦП в любое время. (Обычно этого не происходит, потому что планировщик пытается минимизировать перемещения между центральными процессорами для хранения кэшей горячими, но это возможно.) Вызывающая сторона должна быть готова обработать ситуацию, когда CPU и узлом больше не является текущий ЦП и узел.

21
ответ дан 30 November 2019 в 12:58
поделиться

Необходимо сделать что-то как:

  • Вызов sched_getaffinity и определяет, что биты ЦП
  • Выполняют итерации по центральным процессорам, делая sched_setaffinity каждому (я не уверен, как ли после sched_setaffinity Вы, гарантируют, будете на ЦП или должны уступить явно?)
  • Выполняют CPUID (asm инструкция)... существует способ вытащить уникальный идентификатор на ядро из одного из, его - выводы (см. документы Intel ). Я неопределенно вспоминаю, что это - "идентификатор APIC".
  • Сборка таблица (станд.:: карта?) от идентификаторов APIC до числа ЦП или маски привязки или чего-то.
  • , Если Вы сделали это на своем основном потоке, не забывайте задерживать sched_setaffinity ко всем CPU!

Теперь Вы можете CPUID снова каждый раз, когда Вы должны и поиск, какое ядро Вы идете.

, Но я запросил бы, почему необходимо сделать это; обычно Вы хотите взять на себя управление через sched_setaffinity вместо того, чтобы узнать, какое ядро Вы идете (и даже это - довольно редкая вещь хотеть/нуждаться). (Вот почему я не знаю решающую деталь того, что выйти из CPUID точно, извините!)

Обновление: Просто ставший известный о sched_getcpu от ответа litb здесь. Намного лучше! (мой Debian/etch libc слишком стар, чтобы иметь его хотя).

5
ответ дан 30 November 2019 в 12:58
поделиться

Я не знаю ни о чем для получения текущего базового идентификатора. С миграцией задачи/процесса уровня ядра Вам не гарантировали бы это, это останется постоянным в течение любого отрезка времени, если Вы не работали в некоторой форме режима реального времени.

, Если Вы хотите быть на определенном ядре, можно поместить использование что sched_setaffinity() функция или эти taskset команда для запуска программы. Я полагаю, что им нужны поднятые разрешения на работу, все же. В Вашей программе Вы могли затем работать sched_getaffinity() для наблюдения маски, которая была установлена ранее, и используйте это, поскольку лучшее предполагает ядро, на котором Вы выполняетесь.

2
ответ дан 30 November 2019 в 12:58
поделиться
sysconf(_SC_NPROCESSORS_ONLN);
-1
ответ дан 30 November 2019 в 12:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: