我为4个套接字服务器为大对象(双打矩阵)编写NUMA-aaware缓存。我观察到,插件间通信是我的应用程序的瓶颈。因此,我希望不同套接字上的线程具有单独的矩阵缓存。我已经将线程绑定到特定的物理处理器,现在我需要让线程选择正确的缓存。
假设缓存按以下方式定义:
matrix_cache_t *cache[SOCKETS_LIMIT];
我需要每个线程知道它的套接字ID并选择正确的缓存,例如cache[0]
,cache[1]
,cache[2]
或cache[3]
。
我使用OpenMP在C语言中编写应用程序,它应该在Windows和Linux上运行。
答案 0 :(得分:0)
在Windows下,您可以使用RelationNumaNode
或RelationProcessorPackage
关系使用GetLogicalProcessorInformationEx()
API。它为您提供了相应关系中所有处理器的位,这些位对应于用于将线程绑定到处理器的相关性位。
在Linux下,您可以使用sched_getcpu
#include <stdio.h>
#include <sched.h>
int sched_getcpu();
int main()
{
(void) printf("cpu %d\n", sched_getcpu());
}
可以在/proc/cpuinfo
或/sys/devices/system/cpu/cpu0/topology/physical_package_id