Pro XP, rychlé googlování odhalilo toto:
https://www.cs.tcd.ie/Jeremy.Jones/GetCurrentProcessorNumberXP.htm Pomůže to?
Pokud vše, co chcete udělat, je vyhnout se sporům, nepotřebujete znát aktuální CPU. Mohli jste si náhodně vybrat hromadu. Nebo můžete mít hromadu na vlákno. I když tímto způsobem můžete získat více či méně sporů, vyhnete se režii dotazování aktuálního CPU, což může, ale nemusí být významné. Podívejte se také na scalable_allocator Intel Thread Building Block, který už možná tento problém vyřešil lépe než vy.
Z výstupu 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)
Bohužel je to specifické pro Linux. Pochybuji, že existuje přenosný způsob, jak to udělat.
Kromě odpovědi Antonyho Vennarda a kódu na citovaném webu je zde kód, který bude fungovat také pro Visual C++ x64 (žádný inline assembler):
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;
}
Krátký pohled na implementaci GetCurrentProcessorNumber() na Win7 x64 ukazuje, že používají jiný mechanismus k získání čísla procesoru, ale v mých (několika) testech byly výsledky stejné pro mou domácí i oficiální funkci.