确定正在运行的线程的套接字/处理器

时间:2014-08-18 22:22:29

标签: c multithreading openmp numa

我为4个套接字服务器为大对象(双打矩阵)编写NUMA-aaware缓存。我观察到,插件间通信是我的应用程序的瓶颈。因此,我希望不同套接字上的线程具有单独的矩阵缓存。我已经将线程绑定到特定的物理处理器,现在我需要让线程选择正确的缓存。

假设缓存按以下方式定义:

matrix_cache_t *cache[SOCKETS_LIMIT];

我需要每个线程知道它的套接字ID并选择正确的缓存,例如cache[0]cache[1]cache[2]cache[3]

我使用OpenMP在C语言中编写应用程序,它应该在Windows和Linux上运行。

1 个答案:

答案 0 :(得分:0)

在Windows下,您可以使用RelationNumaNodeRelationProcessorPackage关系使用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

中找到套接字ID