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

问题描述 投票:3回答:1

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

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

matrix_cache_t *cache[SOCKETS_LIMIT];

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

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

c multithreading openmp numa
1个回答
0
投票

在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中找到

© www.soinside.com 2019 - 2024. All rights reserved.