Как узнать номер процессора, на котором запущен поток? - PullRequest
15 голосов
/ 07 февраля 2010

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

Я нашел функцию GetCurrentProcessorNumber() для Windows, но она работает только в Windows Vista и более поздних версиях. Есть ли способ, который работает в Windows XP?

Кроме того, это можно сделать с помощью pthreads в системе POSIX?

Ответы [ 5 ]

9 голосов
/ 07 февраля 2010

С выхода man sched_getcpu:

NAME
       sched_getcpu - determine CPU on which the calling thread is running

SYNOPSIS
       #define _GNU_SOURCE
       #include <utmpx.h>

       int sched_getcpu(void);

DESCRIPTION
   sched_getcpu() returns the number of the CPU
   on which the calling thread is currently executing.

RETURN VALUE
   On success, sched_getcpu() returns a non-negative CPU number.
   On error, -1 is returned and errno is set to indicate the error.

SEE ALSO
   getcpu(2)

К сожалению, это специфично для Linux. Я сомневаюсь, что есть портативный способ сделать это.

8 голосов
/ 07 февраля 2010

Для XP, быстрый гугл, который показал это: https://www.cs.tcd.ie/Jeremy.Jones/GetCurrentProcessorNumberXP.htm Помогает ли это?

3 голосов
/ 18 сентября 2013

В дополнение к ответу Энтони Веннарда и коду на указанном сайте приведен код, который будет работать и для Visual C ++ x64 (без встроенного ассемблера):

DWORD GetCurrentProcessorNumberXP() {
   int CPUInfo[4];   
   __cpuid(CPUInfo, 1);
   // CPUInfo[1] is EBX, bits 24-31 are APIC ID
   if ((CPUInfo[3] & (1 << 9)) == 0) return -1;  // no APIC on chip
   return (unsigned)CPUInfo[1] >> 24;
}

Краткий обзор реализации GetCurrentProcessorNumber () в Win7 x64 показывает, что они используют другой механизм для получения номера процессора, но в моих (нескольких) тестах результаты были одинаковыми для моей домашней и официальной функции .

1 голос
/ 30 апреля 2012

Если все, что вы хотите сделать, это избежать конфликтов, вам не нужно знать текущий процессор. Вы можете просто случайно выбрать кучу. Или вы можете иметь кучу на поток. Несмотря на то, что вы можете получить более или менее раздоры таким образом, вы избежите накладных расходов на опрос текущего ЦП, которые могут быть или не быть значительными. Также ознакомьтесь с scalable_allocator Intel Thread Building Block, который, возможно, уже решил эту проблему лучше, чем вы.

0 голосов
/ 07 февраля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...