我有一个内存堆pipe理器,它根据系统上的处理器数量将堆分成不同的段。 内存只能分配到当前正在运行的线程处理器的分区。 这将有助于允许不同的处理器继续运行,即使两个不同的处理器要同时分配内存,至less我相信。
我发现了Windows的函数GetCurrentProcessorNumber(),但是这只适用于Windows Vista和更高版本。 有没有一种方法可以在Windows XP上运行?
另外,这可以通过POSIX系统上的pthread来完成吗?
对于XP,快速谷歌显示这一点: https: //www.cs.tcd.ie/Jeremy.Jones/GetCurrentProcessorNumberXP.htm这有帮助吗?
从man sched_getcpu
输出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特有的。 我怀疑有一个便携的方式来做到这一点。
除了Antony Vennard的回答以及引用网站上的代码之外,以下代码还可用于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; }
在Win7 x64上对GetCurrentProcessorNumber()的实现进行简短的介绍,表明它们使用不同的机制来获取处理器编号,但在我的(少数)测试中,结果与我的家酿和官方函数相同。
如果你只想避免争用,你不需要知道当前的CPU。 你可以随便挑一堆。 或者你可以有一个堆每个线程。 虽然你可能会以这种方式获得更多或更少的争用,但是可以避免轮询当前CPU的开销,这可能是也可能不是重要的。 另外请查看英特尔线程构建模块的scalable_allocator,它可能已经比您更好地解决了这个问题。
这个设计对我来说味道不好。 你似乎正在假设一个线程将保持与特定的CPU相关联。 这是不能保证的。 是的,一个线程通常可以停留在一个单一的CPU上,但是它并不需要,最终你的程序将有一个切换CPU的线程。 这可能不会经常发生,但最终会发生。 如果你的设计没有考虑到这一点,那么你很可能最终会遇到某种难以追查的错误。
让我问这个问题,如果内存分配在一个CPU上并释放另一个CPU会发生什么? 你的堆将如何处理?