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