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