Как вы можете найти номер процессора, на котором работает поток?

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

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

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

Ответы

Ответ 2

От выхода 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. Я сомневаюсь, что есть переносной способ сделать это.

Ответ 3

В дополнение к ответам Antony Vennard и кода на указанном сайте, вот код, который будет работать и для Visual С++ 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 показывает, что они используют другой механизм для получения номера процессора, но в моих (нескольких) тестах результаты были одинаковыми для моего домашнего бранинга и официальной функции.

Ответ 4

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

Ответ 5

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

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